Nicolas Cellier uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-nice.1033.mcz
==================== Summary ====================
Name: System-nice.1033
Author: nice
Time: 6 June 2018, 11:32:39.671798 pm
UUID: 0168c19e-6a18-4ad6-a6d8-213f48663765
Ancestors: System-ul.1032
Use the well known (x ifNil: [...]) idiom rather than the longer (x ifNotNil: [:y | y] ifNil: [...])
=============== Diff against System-ul.1032 ===============
Item was changed:
----- Method: ChangeSet class>>assuredChangeSetNamed: (in category 'services') -----
assuredChangeSetNamed: aName
"Answer a change set of the given name. If one already exists, answer that, else create a new one and answer it."
+ ^(self named: aName)
- | existing |
- ^ (existing := self named: aName)
- ifNotNil:
- [existing]
ifNil:
[self basicNewChangeSet: aName]!
Nicolas Cellier uploaded a new version of Tools to project The Trunk:
http://source.squeak.org/trunk/Tools-nice.819.mcz
==================== Summary ====================
Name: Tools-nice.819
Author: nice
Time: 6 June 2018, 11:30:43.993178 pm
UUID: 46babe2b-7912-436f-bf9e-95cdb40717c7
Ancestors: Tools-tpr.818
Use the well known (x ifNil: [...]) idiom rather than the longer (x ifNotNil: [:y | y] ifNil: [...])
=============== Diff against Tools-tpr.818 ===============
Item was changed:
----- Method: ChangesOrganizer class>>assuredChangeSetNamed: (in category 'services') -----
assuredChangeSetNamed: aName
"Answer a change set of the given name. If one already exists, answer that, else create a new one and answer it."
+ ^(self changeSetNamed: aName)
- | existing |
- ^ (existing := self changeSetNamed: aName)
- ifNotNil:
- [existing]
ifNil:
[self basicNewChangeSet: aName]!
Item was changed:
----- Method: ProcessBrowser>>pcRange (in category 'stack list') -----
pcRange
"Answer the indices in the source code for the method corresponding to
the selected context's program counter value."
(selectedContext isNil or: [methodText isEmptyOrNil]) ifTrue:
[^ 1 to: 0].
^selectedContext debuggerMap
+ rangeForPC: (selectedContext pc ifNil: [selectedContext method endPC])
- rangeForPC: (selectedContext pc ifNotNil: [:pc| pc] ifNil: [selectedContext method endPC])
in: selectedContext method
contextIsActiveContext: stackListIndex = 1!
tim Rowledge uploaded a new version of Tools to project The Trunk:
http://source.squeak.org/trunk/Tools-tpr.818.mcz
==================== Summary ====================
Name: Tools-tpr.818
Author: tpr
Time: 5 June 2018, 4:52:21.020441 pm
UUID: 62fb39e0-5fe8-4598-abb5-be5a0a754547
Ancestors: Tools-eem.817
Clean up a rather odd looking clause in these methods; it was checking to see if a certain class exists in the image but then
a) naming the parameter in the #ifNil:ifNotNil: with the class name
b) then referring to the class by name within the block.
It seems a bit weird that the compiler would accept that without complaining about mis-use of a global as a block temp and so on, but evidently it worled.
The code generates exactly the same bytecodes. I think it looks a lot less confusing with a 'proper' temp variable name though.
=============== Diff against Tools-eem.817 ===============
Item was changed:
----- Method: Browser>>messageHelpFor: (in category 'message list') -----
messageHelpFor: aSelector
"Show the first n lines of the sources code of the message behind aSelector."
| source formatted iconHelp |
Preferences balloonHelpInMessageLists ifFalse: [^ nil].
source := self selectedClassOrMetaClass sourceCodeAt: aSelector ifAbsent: [^ nil].
source lineCount > 5 ifTrue: [
| sourceLines |
sourceLines := (source asString lines copyFrom: 1 to: 5) asOrderedCollection.
sourceLines add: ' [...]'.
source := sourceLines joinSeparatedBy: Character cr].
formatted := (Smalltalk classNamed: #SHTextStylerST80)
ifNil: [ source asText ]
+ ifNotNil: [ :textStylerClass |
+ textStylerClass new
- ifNotNil: [ :SHTextStylerST80 |
- SHTextStylerST80 new
classOrMetaClass: self selectedClassOrMetaClass;
styledTextFor: source asText ].
iconHelp := (self messageIconHelpFor: aSelector) ifNotEmpty: [:t |
t , Character cr, Character cr].
^ iconHelp asText
append: formatted;
yourself!
Item was removed:
- ----- Method: Context>>inspectorClass (in category '*Tools-Inspector') -----
- inspectorClass
- "Answer the class of the inspector to be used on the receiver. Called by inspect;
- use basicInspect to get a normal (less useful) type of inspector."
-
- ^ ContextInspector!
Item was changed:
----- Method: Debugger>>messageHelpAt: (in category 'context stack (message list)') -----
messageHelpAt: anIndex
"Show the first n lines of the sources code of the selected message."
| method source formatted lineCount |
Preferences balloonHelpInMessageLists ifFalse: [^ nil].
contextStack size < anIndex ifTrue: [^ nil].
method := (contextStack at: anIndex) method.
source := method getSource.
formatted := (Smalltalk classNamed: #SHTextStylerST80)
ifNil: [ source asText ]
+ ifNotNil: [ :textStylerClass |
+ textStylerClass new
- ifNotNil: [ :SHTextStylerST80 |
- SHTextStylerST80 new
classOrMetaClass: method methodClass;
styledTextFor: source asText ].
lineCount := 0.
source doWithIndex: [:char :index |
char = Character cr ifTrue: [lineCount := lineCount + 1].
lineCount > 10 ifTrue: [
formatted := formatted copyFrom: 1 to: index-1.
formatted append: ' [...]'.
^ formatted]].
^ formatted!
Item was changed:
----- Method: MessageSet>>messageHelpAt: (in category 'message list') -----
messageHelpAt: anIndex
"Show the first n lines of the sources code of the selected message."
| reference source formatted lineCount |
Preferences balloonHelpInMessageLists ifFalse: [^ nil].
self messageList size < anIndex ifTrue: [^ nil].
reference := self messageList at: anIndex.
reference isValid ifFalse: [^ nil].
source := reference compiledMethod getSource.
formatted := (Smalltalk classNamed: #SHTextStylerST80)
ifNil: [ source asText ]
+ ifNotNil: [ :textStylerClass |
+ textStylerClass new
- ifNotNil: [ :SHTextStylerST80 |
- SHTextStylerST80 new
classOrMetaClass: reference actualClass;
styledTextFor: source asText ].
lineCount := 0.
source doWithIndex: [:char :index |
char = Character cr ifTrue: [lineCount := lineCount + 1].
lineCount > 10 ifTrue: [
formatted := formatted copyFrom: 1 to: index-1.
formatted append: ' [...]'.
^ formatted]].
^ formatted!
Item was changed:
----- Method: TimeProfileBrowser>>messageHelpAt: (in category 'message list') -----
messageHelpAt: anIndex
"Show the first n lines of the sources code of the selected message."
| reference source formatted lineCount |
Preferences balloonHelpInMessageLists ifFalse: [^ nil].
self messageList size < anIndex ifTrue: [^ nil].
reference := (self methodReferences at: anIndex) ifNil: [ ^nil ].
reference isValid ifFalse: [ ^nil ].
source := reference compiledMethod getSource.
formatted := (Smalltalk classNamed: #SHTextStylerST80)
ifNil: [ source asText ]
+ ifNotNil: [ :textStylerClass |
+ textStylerClass new
- ifNotNil: [ :SHTextStylerST80 |
- SHTextStylerST80 new
classOrMetaClass: reference actualClass;
styledTextFor: source asText ].
lineCount := 0.
source doWithIndex: [:char :index |
char = Character cr ifTrue: [lineCount := lineCount + 1].
lineCount > 10 ifTrue: [
formatted := formatted copyFrom: 1 to: index-1.
formatted append: ' [...]'.
^ formatted]].
^ formatted!
tim Rowledge uploaded a new version of ShoutCore to project The Trunk:
http://source.squeak.org/trunk/ShoutCore-tpr.61.mcz
==================== Summary ====================
Name: ShoutCore-tpr.61
Author: tpr
Time: 5 June 2018, 4:18:00.297486 pm
UUID: ffdd7656-d3c0-4017-994b-166224604658
Ancestors: ShoutCore-mt.60
Small performance optimisation for Shout when text is being saved; instead of the nasty #isKindOf: test the need to preserve the text attribute by sending a message not only actually does the same thing but appears to be intended for just this.
=============== Diff against ShoutCore-mt.60 ===============
Item was changed:
----- Method: SHTextStylerST80>>unstyledTextFrom: (in category 'converting') -----
unstyledTextFrom: aText
"Re-implemented so that TextActions are not removed from aText"
| answer |
answer := super unstyledTextFrom: aText.
aText runs withStartStopAndValueDo: [:start :stop :attribs |
+ (attribs anySatisfy: [:each | each shoutShouldPreserve])
- (attribs anySatisfy: [:each | each isKindOf: TextAction])
ifTrue: [
attribs do: [:eachAttrib | answer addAttribute: eachAttrib from: start to: stop]]].
^answer!
Chris Muller uploaded a new version of Help-Squeak-Project to project The Trunk:
http://source.squeak.org/trunk/Help-Squeak-Project-cmm.53.mcz
==================== Summary ====================
Name: Help-Squeak-Project-cmm.53
Author: cmm
Time: 5 June 2018, 2:42:27.90827 pm
UUID: 3d4c880f-ce29-400f-8f70-11830baf165e
Ancestors: Help-Squeak-Project-tpr.52
Update SqueakV46.sources to SqueakV50.sources.
=============== Diff against Help-Squeak-Project-tpr.52 ===============
Item was changed:
----- Method: SqueakProjectHelp class>>workingWithSqueak (in category 'pages') -----
workingWithSqueak
"This method was automatically generated. Edit it using:"
"SqueakProjectHelp edit: #workingWithSqueak"
^(HelpTopic
title: 'Working with Squeak'
contents:
'Working with Squeak
Take few minutes and get familiar with the image concept of the Squeak/Smalltalk system. This includes starting and quitting the image, learning where all the objects live, and understanding where your source code resides.
1. Starting and Quitting
Like most Smalltalks, the machine-executable portion is a relatively small program known as the "virtual machine" (VM). The VM''s job is to provide services from the physical machine to real Smalltalk objects. Services like input and output. The Smalltalk system, including all data and code, is a system of objects, built from the ground up, and interpreted by this virtual computer. This affords Smalltalk system platform portability.
Smalltalk cannot run without the VM. The VM can''t do anything useful except process Smalltalk systems.
To start the system, drag the ".image" data file to the VM executable "squeak". There are myriad command-line options for starting the system via the command-line (see squeak --help). By default, the system will open on the screen in a single OS window.
To quit a Squeak session, choose ''quit'' from the menu bar. If you save, the image file will be overwritten and resume from that place the next time it''s launched.
2. The Image File
Squeak is an environment built in its own objects from the ground up, including one or more end-user applications. All of the objects in the system -- Classes, Dictionaries, Windows, Customers and other objects that make up the Squeak environment are stored in a binary ".image" file. This is the "object-data file" loaded by the VM when Squeak is launched.
When an image is started, every object resumes exactly from where it was last saved.
3. The Sources File
Smalltalk is traditionally includes the source code in the running system. However, keeping multiple copies of the same source code in all images files is wasteful. Therefore, the source code itself is kept in a read-only .sources file and accessed by all images. The image files merely have pointers into this file, which is read on-the-fly to present original source code.
+ The code of the base system is stored in the file "SqueakV50.sources". This file does not change except between releases of Squeak. Normally this file should be placed in the folder containing the VM executable.
- The code of the base system is stored in the file "SqueakV46.sources". This file does not change except between releases of Squeak. Normally this file should be placed in the folder containing the VM executable.
4. The Changes File
The purpose of Squeak is to develop new programs and systems. Code changes to the running system are effective immediately. But since multiple images can be running, they cannot all update the .sources file safely. Therefore, each image file is accompanied by a ".changes" file which contains source code changes for that and only that Smalltalk system..
The changes file is important for project work. It keeps a sequential log of development activity for the purpose of recovering work performed since the last image-save. Any of several events could lead to the need to recover work, including a power-outage or making an erroneous change to code required to keep the system running.
The changes file does not consume memory space, so Squeak is able to keep a complete history of all program changes. This makes it easy to examine or even reinstate older versions of methods (see ''versions'' option in browser selector pane). This encourages experimentation, since you can easily revert to the original versions of any set of methods.
In extreme cases where sources and/or changes files are not available, the system can still run, and will automatically decompile the bytecode methods in image memory, if necessary, into readable and editable versions of the original source code (only comments and temporary variable names are lost).
5. Transferring Code-Snippets Between Images
In addition to the ''save'' command that saves the entire state of the system, the code of individual methods, categories or classes may be ''filed out'' and then filed-in to another image.
6. Packages
The code of an entire project is encapsulated by a Package. This allows users to share their code with other users. Code of packages are delineated by the categories of their classes, and methods. The Monticello browser is then used to wrap that code into a Package object which can be saved to a Monticello repository at http://ss3.gemtalksystems.com/ss.
Some projects end up using the resources provided by several packages, resulting in a hierarchy of packages that make up a system. Installer can be used to install such systems.!!
]style[(19 225 26 969 17 449 19 596 19 1351 44 189 12 539)b,,i,,i,,i,,i,,i,,i,!!' readStream nextChunkText)
key: #workingWithSqueak!
Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-ul.1176.mcz
==================== Summary ====================
Name: Kernel-ul.1176
Author: ul
Time: 4 June 2018, 7:28:14.840591 pm
UUID: 70ad3394-d256-4a05-91aa-b5b2937739e3
Ancestors: Kernel-ul.1175
- iterative version of Context >> #copyTo: instead of a recursive one
- optimized version of Integer >> #timesRepeat:
=============== Diff against Kernel-ul.1175 ===============
Item was changed:
----- Method: Context>>copyTo: (in category 'query') -----
copyTo: aContext
+ "Copy self and my sender chain down to, but not including, aContext. End of copied chain will have nil sender. Assume that there is no loop in the context chain."
- "Copy self and my sender chain down to, but not including, aContext. End of copied chain will have nil sender."
+ | currentContext senderContext copy |
- | copy |
self == aContext ifTrue: [ ^nil ].
+ currentContext := copy := self copy.
+ [
+ senderContext := (currentContext sender ifNil: [ ^copy ]) copy.
+ currentContext privSender: senderContext.
+ currentContext := senderContext ] repeat!
- copy := self copy.
- sender ifNotNil: [ copy privSender: (sender copyTo: aContext) ].
- ^copy!
Item was changed:
----- Method: Integer>>timesRepeat: (in category 'enumerating') -----
timesRepeat: aBlock
"Evaluate the argument, aBlock, the number of times represented by the
receiver."
+ | remaining |
+ remaining := self.
+ [ (remaining := remaining - 1) >= 0 ] whileTrue: [
+ aBlock value ]!
- | count |
- count := 1.
- [count <= self]
- whileTrue:
- [aBlock value.
- count := count + 1]!
tim Rowledge uploaded a new version of HelpSystem-Core to project The Trunk:
http://source.squeak.org/trunk/HelpSystem-Core-tpr.105.mcz
==================== Summary ====================
Name: HelpSystem-Core-tpr.105
Author: tpr
Time: 3 June 2018, 5:26:00.612967 pm
UUID: 931cf53e-a1da-47bf-819c-44b69a3ea964
Ancestors: HelpSystem-Core-tpr.104
More Help cleanups
=============== Diff against HelpSystem-Core-tpr.104 ===============
Item was changed:
----- Method: HelpHowToHelpTopics class>>overview (in category 'pages') -----
overview
"This method was automatically generated. Edit it using:"
"HelpHowToHelpTopics edit: #overview"
^HelpTopic
title: 'Overview'
contents:
'THE IMPLEMENTATION
The help system typically consists of help books including one or more pages. A book or page is therefore a "topic of interest" providing contents for help to a user. A topic has a title and an icon and is able to have subtopics forming a hierarchy of topics. This simple model is reflected in the class HelpTopic.
Since this model forms a hierarchical structure of help topics there is a browser with a tree to display the help contents. This browser is implemented in class HelpBrowser.
You can open this browser programmatically using:
HelpBrowser open
+
+ (or simply click on that line above)
+ The HelpBrowser is also available from the main menubar at the top of the Squeak screen
+ !!
+ ]style[(566 16 127),dHelpBrowser open;;,!!' readStream nextChunkText!
- !!' readStream nextChunkText!
Item was changed:
----- Method: HelpHowToHelpTopics class>>page1 (in category 'pages') -----
page1
"This method was automatically generated. Edit it using:"
"HelpHowToHelpTopics edit: #page1"
+ ^HelpTopic
- ^HelpTopic
title: '1. Simple help topics'
+ contents:
+ 'The help browser usually operates on a hierarchy of help topics with one help topic at the root level. Evaluate the following expression in a workspace to contruct a simple help topic and open it as a root topic in the help browser, or simply click on the underlined text below
- contents: 'The help browser usually operates on a hierarchy of help topics with one help topic at the root level. Evaluate the following expression in a workspace to contruct a simple help topic and open it as a root topic in the help browser.
|root|
root := HelpTopic
title: ''My first topic''
contents: ''A simple topic of interest''.
HelpBrowser openOn: root
Note that the help browser displays the contents of our topic in the right page and uses the topics title as the title for the help browser window.
+ !!
+ ]style[(283 132 158),d|root|
+ root := HelpTopic
+ title: ''My first topic''
+ contents: ''A simple topic of interest''.
+
+ HelpBrowser openOn: root;;,!!' readStream nextChunkText!
- '!
Item was changed:
----- Method: HelpHowToHelpTopics class>>page2 (in category 'pages') -----
page2
"This method was automatically generated. Edit it using:"
"HelpHowToHelpTopics edit: #page2"
+ ^HelpTopic
- ^HelpTopic
title: '2. Forming a hierarchy'
+ contents:
+ 'To form a hierarchy we just have to add new subtopics on our root topic.
+ Evaluate the following expression in a workspace to contruct a simple help topic and open it as a root topic in the help browser, or simply click on the underlined text below
- contents: 'To form a hierarchy we just have to add new subtopics on our root topic.
|root sub1 sub2|
root := HelpTopic
title: ''My first topic''
contents: ''A simple topic of interest''.
sub1 := HelpTopic
title: ''My first subtopic''
contents: ''First subsection''.
sub2 := HelpTopic
title: ''My second subtopic''
contents: ''Second subsection''.
root
addSubtopic: sub1;
addSubtopic: sub2.
HelpBrowser openOn: root
+ !!
+ ]style[(253 363 6),d|root sub1 sub2|
+ root := HelpTopic
+ title: ''My first topic''
+ contents: ''A simple topic of interest''.
+ sub1 := HelpTopic
+ title: ''My first subtopic''
+ contents: ''First subsection''.
+ sub2 := HelpTopic
+ title: ''My second subtopic''
+ contents: ''Second subsection''.
+ root
+ addSubtopic: sub1;
+ addSubtopic: sub2.
+ HelpBrowser openOn: root;;,!!' readStream nextChunkText!
- '!
Item was changed:
----- Method: HelpHowToHelpTopics class>>page3 (in category 'pages') -----
page3
"This method was automatically generated. Edit it using:"
"HelpHowToHelpTopics edit: #page3"
+ ^HelpTopic
- ^HelpTopic
title: '3. Adding icons'
+ contents:
+ 'If you dont like the default icon you can add own custom icons to the topics. See the class HelpIcons for more details.
+ Note how the icon is added to the ''sub2'' section from the previous example.
+
+ Evaluate the following expression in a workspace to contruct a simple help topic and open it as a root topic in the help browser, or simply click on the underlined text below
- contents: 'If you dont like the default icon you can add own custom icons to the topics. See the class HelpIcons for more details.
|root sub1 sub2|
root := HelpTopic
title: ''My first topic''
contents: ''A simple topic of interest''.
sub1 := HelpTopic
title: ''My first subtopic''
contents: ''First subsection''.
sub2 := HelpTopic
title: ''My second subtopic''
icon: (HelpIcons iconNamed: #packageIcon)
contents: ''Second subsection''.
root
addSubtopic: sub1;
addSubtopic: sub2.
HelpBrowser openOn: root
+ !!
+ ]style[(377 416 6),d|root sub1 sub2|
+ root := HelpTopic
+ title: ''My first topic''
+ contents: ''A simple topic of interest''.
+ sub1 := HelpTopic
+ title: ''My first subtopic''
+ contents: ''First subsection''.
+ sub2 := HelpTopic
+ title: ''My second subtopic''
+ icon: (HelpIcons iconNamed: #packageIcon)
+ contents: ''Second subsection''.
+ root
+ addSubtopic: sub1;
+ addSubtopic: sub2.
+ HelpBrowser openOn: root;;,!!' readStream nextChunkText!
- '!
Item was changed:
----- Method: HelpHowToHelpTopics class>>page4 (in category 'pages') -----
page4
"This method was automatically generated. Edit it using:"
"HelpHowToHelpTopics edit: #page4"
+ ^HelpTopic
+ title: '4. Your own help objects'
+ contents:
+ 'You can open this help browser directly on an instance of HelpTopic, but it is more common to open it on any object that understands the message #asHelpTopic.
- ^HelpTopic
- title: '4. Own help objects'
- contents:
- 'You can open this help browser directly on an instance of HelpTopic, but it is more common to open it on any object that understands the message #asHelpTopic.
So you can write for instance:
HelpBrowser openOn: Integer
opening a short API help/system reference on the Integer class.
The above expression is the short form for:
HelpBrowser openOn: (SystemReference forClass: Integer)
If you want you can include the subclasses:
HelpBrowser openOn: (SystemReference hierarchyFor: Integer)
or even methods
HelpBrowser openOn: (SystemReference hierarchyWithMethodsFor: Integer)
You can browse the whole system reference documentation using:
HelpBrowser openOn: SystemReference
But these are only a few examples what we can extract from the
system.
+ However - the major goal for this is NOT an API browser as the typical method comments are not generally suited to making an automatic API document. The idea is to provide a simple architecture to produce browsable help contents depending on the context. For instance it should also be possible to use the help system to provide end user help on any commercial application that is written with the Smalltalk system.
- However - the major goal is NOT an API browser, the idea is to
- provide a simple architecture to provide browsable help contents
- depending on the context. For instance it should also be possible
- to use the help system to provide end user help on any commercial
- application that is written with the Smalltalk system.
+ !!
+ ]style[(195 27 114 55 50 59 22 70 70 35 494),dHelpBrowser openOn: Integer;;,,dHelpBrowser openOn: (SystemReference forClass: Integer);;,,dHelpBrowser openOn: (SystemReference hierarchyFor: Integer);;,,dHelpBrowser openOn: (SystemReference hierarchyWithMethodsFor: Integer);;,,dHelpBrowser openOn: SystemReference;;,!!' readStream nextChunkText!
- ' !
Item was changed:
----- Method: HelpHowToHelpTopics class>>page5 (in category 'pages') -----
page5
"This method was automatically generated. Edit it using:"
"HelpHowToHelpTopics edit: #page5"
+ ^HelpTopic
- ^HelpTopic
title: '5. Help sources'
+ contents:
+ 'Since the underlying model is very simple you can easily fill it with nearly any information from different sources. Try this:
- contents:
- 'Since the underlying model is very simple you can easily fill it with nearly any information from different sources. Try this:
|topic day url sub|
topic := HelpTopic named: ''Last week on Squeak IRC''.
0 to: 7 do: [:index |
day := (Date today subtractDays: index) printFormat: #(3 2 1 $. 1 2 2).
url := ''http://tunes.org/~nef/logs/squeak/'' , day.
sub := HelpTopic
title: day contents: (HTTPLoader default retrieveContentsFor: url) contents.
topic addSubtopic: sub.
].
HelpBrowser openOn: topic
+ !!
+ ]style[(128 372 7),d|topic day url sub|
+ topic := HelpTopic named: ''Last week on Squeak IRC''.
+ 0 to: 7 do: [:index |
+ day := (Date today subtractDays: index) printFormat: #(3 2 1 $. 1 2 2).
+ url := ''http://tunes.org/~nef/logs/squeak/'' , day.
+ sub := HelpTopic
+ title: day contents: (HTTPLoader default retrieveContentsFor: url) contents.
+ topic addSubtopic: sub.
+ ].
+ HelpBrowser openOn: topic;;,!!' readStream nextChunkText!
- ' !
Item was changed:
----- Method: HelpHowToHelpTopicsFromCode class>>overview (in category 'pages') -----
overview
"This method was automatically generated. Edit it using:"
"HelpHowToHelpTopicsFromCode edit: #overview"
^HelpTopic
title: 'Overview'
+ contents:
+ 'Overview
- contents:
- 'OVERVIEW
+ The help system allows you to provide your own help books and help texts. You can open the help browser on any object that is able to understand #asHelpTopic.
- The help system allows you to provide own books and help texts. You can open the help browser on any object that is able to understand #asHelpTopic.
This method returns the root node of the displayed topic hierarchy:
HelpBrowser openOn: myObject
+ Typically the object does not convert itself to a help topic structure; rather it dispatches to a builder (see HelpBuilder and subclasses) that does all this.
- Typically the object does not convert itself to a help topic structure, usually it dispatches to a builder (see HelpBuilder and subclasses) who does all this.
+ A much more convenient and reproducable way is to implement custom help classes. This allows you to implement and manage your help texts using the standard development and code management tools. These custom help classes are subclasses of "CustomHelp" and are automatically included into the standard help browser. !!
+ ]style[(387 11 280 10 65),LHelpBuilder Hierarchy;,,LCustomHelp Hierarchy;,!!' readStream nextChunkText!
- A much more convenient and reproducable way is to implement custom help classes. This allows you to implement and manage your help texts using the standard development and code management tools. These custom help classes are subclasses of "CustomHelp" and are automatically included into the standard help browser. '!