<?xml version="1.0"?>

<st-source>
<!-- 
Name: VWHelp
Notice: Copyright © 2005 Cincom Systems, Inc.  All Rights Reserved.
Comment: Contains the prototype VisualWorks Online Help Browser. 

The Help Browser provides a hypertext presentation of the online help content contained in the XML files found in the /help directory of your VisualWorks installation.
DbIdentifier: bear73
DbTrace: 54254
DevelopmentPrerequisites: #(#(#any 'Arbor GIF Reader Writer' '') #(#any 'Arbor Help System Outline Help Core' '') #(#any 'ImageReaders' ''))
PackageName: VWHelp
Parcel: #('VWHelp')
ParcelName: VWHelp
PrerequisiteParcels: #(#('Arbor GIF Reader Writer' '') #('Arbor Help System Outline Help Core' '') #('ImageReaders' ''))
PrintStringCache: (7.4 - 1.1,bobw)
Version: 7.4
Pre-Load Block: 
	[ :pkg |  

]
Post-Load Block: 
	[ :pkg |  
#{VWHelp.HelpBrowser} value postLoadSetUp
]
Pre-Unload Block: 
	[ :pkg |  
#{VWHelp.HelpBrowser} value preUnloadFor:pkg
]
Post-Unload Block: 
	[

]
Date: 2:06:46 pm December 5, 2005
 -->
<time-stamp>From VisualWorks®, 7.4 of December 5, 2005 on December 5, 2005 at 2:06:46 pm</time-stamp>


<do-it>(Dialog confirm: 'You are filing-in a Parcel source file!\\While this is possible it will not have\the same effect as loading the parcel.\None of the Parcel''s prerequisites will\be loaded and none of its load actions\will be performed.\\Are you sure you want to file-in?' withCRs) ifFalse: [self error: 'Parcel file-in abandoned.  Choose terminate or close.']</do-it>

<class>
<name>Component</name>
<environment>VWHelp</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>contents title </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Components</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>HelpNodeBuilder</name>
<environment>VWHelp</environment>
<super>XML.NodeBuilder</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>helpTagsDictionary </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes-Support</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Outline</name>
<environment>VWHelp</environment>
<super>VWHelp.Component</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>atStart docFile topicTree topicName topicText topicDepth treeDepths topicDir graphicTable xmlOutline stepIndex </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Components</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Reader</name>
<environment>VWHelp</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>files currentTarget </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Support</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Proxy</name>
<environment>VWHelp</environment>
<super>UI.ValueHolder</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>displayString fileIndex </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Support</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>HelpElement</name>
<environment>VWHelp</environment>
<super>XML.Element</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes-TopLevel</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Bold</name>
<environment>VWHelp</environment>
<super>VWHelp.HelpElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Code</name>
<environment>VWHelp</environment>
<super>VWHelp.HelpElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>ListElement</name>
<environment>VWHelp</environment>
<super>VWHelp.HelpElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>itemStart </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes-TopLevel</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>OrderedListElement</name>
<environment>VWHelp</environment>
<super>VWHelp.ListElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>index </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes-TopLevel</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>ListCont</name>
<environment>VWHelp</environment>
<super>VWHelp.OrderedListElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>UILabel</name>
<environment>VWHelp</environment>
<super>VWHelp.HelpElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>HyperLink</name>
<environment>VWHelp</environment>
<super>VWHelp.HelpElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>linkArguments </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes-TopLevel</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>HyperExample</name>
<environment>VWHelp</environment>
<super>VWHelp.HyperLink</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>HyperGraphic</name>
<environment>VWHelp</environment>
<super>VWHelp.HyperLink</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>ListStart</name>
<environment>VWHelp</environment>
<super>VWHelp.OrderedListElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>OutlineEntry</name>
<environment>VWHelp</environment>
<super>VWHelp.AHSHelpOutlineEntry</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>proxy outlineFile </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Components</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>GlossaryEntry</name>
<environment>VWHelp</environment>
<super>VWHelp.HelpElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Heading</name>
<environment>VWHelp</environment>
<super>VWHelp.HelpElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes-TopLevel</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Heading1</name>
<environment>VWHelp</environment>
<super>VWHelp.Heading</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Heading4</name>
<environment>VWHelp</environment>
<super>VWHelp.Heading</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Heading2</name>
<environment>VWHelp</environment>
<super>VWHelp.Heading</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>HyperExampleLinkObject</name>
<environment>VWHelp</environment>
<super>VWHelp.AHSHelpHyperLinkObject</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>exampleClass </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Hypertext</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Book</name>
<environment>VWHelp</environment>
<super>VWHelp.Component</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>fileID </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Components</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>ExamplesBrowser</name>
<environment>Examples</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Tools-Help</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<comment>
<class-id>Examples.ExamplesBrowser</class-id>
<body>NOTE: This class is obsolete, and included only because a number of examples in the Application Developer's Guide invoke:
    ExamplesBrowser prepareScratchWindow
Once that function is replaced with a real ScratchWindow, this class will be eliminated.

Shared Variables:
	ScratchWindow	&lt;ApplicationWindow&gt; The window in which graphic examples display
					their output.</body>
</comment>

<class>
<name>CodeEmphasis</name>
<environment>VWHelp</environment>
<super>VWHelp.Code</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>HelpBrowser</name>
<environment>VWHelp</environment>
<super>VWHelp.AHSOutlineViewer</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>helpDir pathnames library </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Support</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Body</name>
<environment>VWHelp</environment>
<super>VWHelp.HelpElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes-TopLevel</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Definition</name>
<environment>VWHelp</environment>
<super>VWHelp.Body</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes-TopLevel</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>DefinitionItem</name>
<environment>VWHelp</environment>
<super>VWHelp.Definition</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>DefinitionDescription</name>
<environment>VWHelp</environment>
<super>VWHelp.Definition</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>PlatformElement</name>
<environment>VWHelp</environment>
<super>VWHelp.HelpElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Heading3</name>
<environment>VWHelp</environment>
<super>VWHelp.Heading</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Anchor</name>
<environment>VWHelp</environment>
<super>VWHelp.HyperLink</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>CodeSample</name>
<environment>VWHelp</environment>
<super>VWHelp.HelpElement</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Nodes</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<class>
<name>Library</name>
<environment>VWHelp</environment>
<super>VWHelp.Component</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Components</category>
<attributes>
<package>VWHelp</package>
</attributes>
</class>

<shared-variable>
<name>CodeTags</name>
<environment>VWHelp.CodeSample</environment>
<private>false</private>
<constant>false</constant>
<category>tag-constants</category>
<attributes>
<package>VWHelp</package>
</attributes>
</shared-variable>

<shared-variable>
<name>PlatformTags</name>
<environment>VWHelp.PlatformElement</environment>
<private>false</private>
<constant>false</constant>
<category>tag-constants</category>
<attributes>
<package>VWHelp</package>
</attributes>
</shared-variable>

<shared-variable>
<name>SystemDefault</name>
<environment>VWHelp.Library</environment>
<private>false</private>
<constant>false</constant>
<category>defaults</category>
<attributes>
<package>VWHelp</package>
</attributes>
</shared-variable>

<shared-variable>
<name>TopicContentsTagList</name>
<environment>VWHelp.Outline</environment>
<private>false</private>
<constant>false</constant>
<category>tag-constants</category>
<attributes>
<package>VWHelp</package>
</attributes>
</shared-variable>

<shared-variable>
<name>DefaultStorer</name>
<environment>VWHelp.Proxy</environment>
<private>false</private>
<constant>false</constant>
<category>defaults</category>
<attributes>
<package>VWHelp</package>
</attributes>
</shared-variable>

<shared-variable>
<name>BoldTags</name>
<environment>VWHelp.Bold</environment>
<private>false</private>
<constant>false</constant>
<category>tag-constants</category>
<attributes>
<package>VWHelp</package>
</attributes>
</shared-variable>

<shared-variable>
<name>MultipleHelpBrowsers</name>
<environment>VWHelp.HelpBrowser</environment>
<private>false</private>
<constant>false</constant>
<category>defaults</category>
<attributes>
<package>VWHelp</package>
</attributes>
</shared-variable>

<shared-variable>
<name>DefaultDir</name>
<environment>VWHelp.HelpBrowser</environment>
<private>false</private>
<constant>false</constant>
<category>defaults</category>
<attributes>
<package>VWHelp</package>
</attributes>
</shared-variable>

<shared-variable>
<name>UILabelTags</name>
<environment>VWHelp.UILabel</environment>
<private>false</private>
<constant>false</constant>
<category>tag-constants</category>
<attributes>
<package>VWHelp</package>
</attributes>
</shared-variable>

<shared-variable>
<name>ScratchWindow</name>
<environment>Examples.ExamplesBrowser</environment>
<private>true</private>
<constant>false</constant>
<category>Defaults</category>
<attributes>
<package>VWHelp</package>
</attributes>
</shared-variable>

<methods>
<class-id>VWHelp.Component</class-id> <category>accessing</category>

<body package="VWHelp" selector="contents">contents

	^contents</body>

<body package="VWHelp" selector="contents:">contents: anObject

	contents := anObject</body>

<body package="VWHelp" selector="listSize">listSize
	"This is implemented primarily for collection-like subclasses."
	^self contents size</body>

<body package="VWHelp" selector="title">title

	^title</body>

<body package="VWHelp" selector="title:">title: aStringOrText

	title := aStringOrText</body>
</methods>

<methods>
<class-id>VWHelp.Component</class-id> <category>testing</category>

<body package="VWHelp" selector="=">= anObject

	"Answer true if the class and title match."
	^(anObject isKindOf: self class) and: [ self title = anObject title]</body>

<body package="VWHelp" selector="contains:">contains: anElement

	"Answer whether anElement is in my contents.
	Collection-like subclasses must override this implementation."
	^false</body>
</methods>

<methods>
<class-id>VWHelp.Component</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="initialize">initialize

	title := ''.</body>
</methods>

<methods>
<class-id>VWHelp.Component class</class-id> <category>instance-creation</category>

<body package="VWHelp" selector="new">new

	^super new initialize</body>

<body package="VWHelp" selector="title:contents:">title: aString contents: elements

	^self new
		title: aString;
		contents: elements.</body>
</methods>

<methods>
<class-id>VWHelp.HelpNodeBuilder</class-id> <category>building</category>

<body package="VWHelp" selector="makeText:">makeText: text

	| txt |
	txt := #{XML.Text} binding value text: text.
	txt isBlankText ifTrue: [ txt discard].
	^txt</body>

<body package="VWHelp" selector="tag:attributes:elements:position:stream:">tag: tag attributes: attributes elements: elements position: p stream: stream

	| elementClass |
	elementClass := self helpTagsDictionary
					at: tag type
					ifAbsent: ["Transcript show: ('The tag &lt;1s&gt; is not yet implemented'
								expandMacrosWith: tag asString);cr."
							  HelpElement].
	^elementClass tag: tag attributes: attributes elements: elements</body>
</methods>

<methods>
<class-id>VWHelp.HelpNodeBuilder</class-id> <category>private</category>

<body package="VWHelp" selector="helpTagsDictionary">helpTagsDictionary

	helpTagsDictionary == nil
	ifTrue:
		[helpTagsDictionary := Dictionary new.
		HelpElement withAllSubclasses do: [:elmClass |
			elmClass tag == nil 
			ifFalse:
				[(elmClass tag isKindOf:List)
				ifTrue:
					[elmClass tag do:[:aTag |
					helpTagsDictionary at:aTag put:elmClass]]
				ifFalse:
					[helpTagsDictionary at: elmClass tag put: elmClass]]]].

	^helpTagsDictionary</body>
</methods>

<methods>
<class-id>VWHelp.Outline</class-id> <category>accessing</category>

<body package="VWHelp" selector="atStart">atStart

	^atStart</body>

<body package="VWHelp" selector="atStart:">atStart:aBoolean

	atStart := aBoolean</body>

<body package="VWHelp" selector="docFile">docFile

	^docFile</body>

<body package="VWHelp" selector="docFile:">docFile: aString

	docFile := aString</body>

<body package="VWHelp" selector="graphicTable">graphicTable



	^graphicTable</body>

<body package="VWHelp" selector="graphicTable:">graphicTable: aValue



	graphicTable := aValue</body>

<body package="VWHelp" selector="stepIndex">stepIndex
	
	^stepIndex</body>

<body package="VWHelp" selector="stepIndex:">stepIndex:aValue
	
	stepIndex := aValue</body>

<body package="VWHelp" selector="topicDepth">topicDepth







	^topicDepth</body>

<body package="VWHelp" selector="topicDepth:">topicDepth:  anIntegerOrNil





	^topicDepth :=  anIntegerOrNil</body>

<body package="VWHelp" selector="topicDir">topicDir

	^topicDir</body>

<body package="VWHelp" selector="topicDir:">topicDir:aString

	topicDir := aString</body>

<body package="VWHelp" selector="topicName">topicName







	^topicName</body>

<body package="VWHelp" selector="topicName:">topicName: aValue







	topicName := aValue</body>

<body package="VWHelp" selector="topicText">topicText



	^topicText</body>

<body package="VWHelp" selector="topicText:">topicText: aValue



	topicText := aValue</body>

<body package="VWHelp" selector="topicTree">topicTree





	^topicTree</body>

<body package="VWHelp" selector="topicTree:">topicTree: aValue



	topicTree := aValue</body>

<body package="VWHelp" selector="treeDepths">treeDepths



	^treeDepths</body>

<body package="VWHelp" selector="treeDepths:">treeDepths: aValue







	treeDepths := aValue</body>

<body package="VWHelp" selector="xmlOutline">xmlOutline



	^xmlOutline</body>

<body package="VWHelp" selector="xmlOutline:">xmlOutline: aValue



	xmlOutline := aValue</body>
</methods>

<methods>
<class-id>VWHelp.Outline</class-id> <category>populating-topics</category>

<body package="VWHelp" selector="adjustSpacing:">adjustSpacing:element

	self atStart
	ifFalse:
		[element isStartElement
		ifTrue:
			[self appendTopicCharacter:Character cr.
			element paragraphSpacing
			ifTrue:
				[self appendTopicCharacter:Character cr]]].</body>

<body package="VWHelp" selector="appendTopicCharacter:">appendTopicCharacter:aCharacter

	self topicTree data text:(self topicTree data text copyWith:aCharacter)</body>

<body package="VWHelp" selector="appendTopicText:">appendTopicText:aHyperText

	| aText |
	aText := self topicTree data text.
	(self isBlankText:aText)
  	ifTrue:
		[self topicTree data text:aHyperText]
	ifFalse:
		[self topicTree data text:(aText, aHyperText)]</body>

<body package="VWHelp" selector="populateTopic:">populateTopic:element

	self topicTree isNil
	ifTrue:
		[^self error:'Cannot populate a topic without a Heading'].

	self topicTree data uniqueID isNil
	ifFalse:
		[self populateTopicWith:element.
		 self atStart:false.]
	ifTrue:[self error:'Cannot populate a topic without an ID']</body>

<body package="VWHelp" selector="populateTopicWith:">populateTopicWith:element

  	| items |
	self adjustSpacing:element.
	element isListElement
	ifTrue:
		[element itemStart:true.
		element isOrderedListElement
		ifTrue:
			[self stepIndexFor:element].
			self appendTopicText:element prependText].
	
	items := element elements.
	items isEmpty 
		ifTrue:[self populateTopicWith:element for:nil]
		ifFalse:
			[items do:
					[:item | self populateTopicWith:item for:element]]</body>

<body package="VWHelp" selector="populateTopicWith:for:">populateTopicWith:element for:aTag
  	
	| aHyperText items |
	element isText
	ifFalse:[element isLinkElement
		ifFalse:[items := element elements.
				items isEmpty  
				ifFalse:
				[items do:[:item | self populateTopicWith:item for:element]]]].
	
	aTag isNil 
	ifFalse:
		[element isText
		ifFalse:
			[aHyperText := self extractHyperText:element]
		ifTrue:
			[aHyperText := aTag formatText:element characterData].
			aHyperText isNil 
			ifFalse:
				[aHyperText := aTag parent formatText:aHyperText.
				self appendTopicText:aHyperText]]
	ifTrue:[self error:'Cannot determine the parent tag of', element]</body>

<body package="VWHelp" selector="stepIndexFor:">stepIndexFor:element

	element tag = ListStart tag
		ifTrue:[self stepIndex:1].
	element tag = ListCont tag
		ifTrue:[self stepIndex:(stepIndex +1)].
	element index:stepIndex</body>
</methods>

<methods>
<class-id>VWHelp.Outline</class-id> <category>private</category>

<body package="VWHelp" selector="buildOutlineFrom:">buildOutlineFrom:aNode

	self xmlOutline: (AHSOutline new fileFormat: #xml;
					yourself).

	self topicTree: nil.
	aNode elements do:
		[:elm |	
		(self class topicContentsTagList includes:(elm tag))
		ifTrue:
			[self populateTopic:elm]
		ifFalse:
			[elm isHeadingElement
			ifTrue:
				[elm tag = Heading1 tag
				ifTrue:[self title:elm characterData trimExteriorCRs]
				ifFalse:
					[self atStart:true. 
					self buildNewTopic:elm]]]].</body>

<body package="VWHelp" selector="findTopicName:">findTopicName: atopicName

	"Find the topic in the outline that has the topic name topicName
	and answer the Tree node, or nil if not found"

	| obj |
	self xmlOutline forest 
	detect:[:eachTree |
			obj := eachTree
					detect: [:node | node data topic = atopicName]
					ifNone: [nil].
			obj notNil]
	ifNone: [].
	^obj</body>
</methods>

<methods>
<class-id>VWHelp.Outline</class-id> <category>testing</category>

<body package="VWHelp" selector="isBlankText:">isBlankText:aText

	^(aText  contains:[:aC | aC isSeparator not]) not</body>
</methods>

<methods>
<class-id>VWHelp.Outline</class-id> <category>building-topics</category>

<body package="VWHelp" selector="buildNewTopic:">buildNewTopic:rootElement

	"Argument is a XML doc root from which a Topic heirarchy is built.
	 Level 1 is extracted during scanning"
	 
	| aTopicName |
	rootElement tag = Heading2 tag 
	ifTrue:[self topicDepth:2]
	ifFalse:
		[rootElement tag = Heading3 tag
		ifTrue:[self topicDepth:3]
		ifFalse:
			[rootElement tag = Heading4 tag
			ifTrue: [self topicDepth:4 ]
			ifFalse: [self error:'Unknown Heading tag ', rootElement tag]]].

	aTopicName := rootElement characterData trimExteriorCRs.
	(aTopicName isEmpty not)
	ifTrue:
		[self startNewTopic.
		 self storeTopicName:rootElement.
		self topicTree notNil 
		ifTrue:
			[self setTopicID]].</body>

<body package="VWHelp" selector="createGraphicLink:">createGraphicLink: linkArguments

	| graphicKey w h graphicFile link |
	graphicFile := linkArguments at:#href.
	graphicKey := #unknownGraphic.
	self graphicTable keysAndValuesDo: 
		[:aKey :aValue | 
		aValue = graphicFile 
		ifTrue: [graphicKey := aKey]].

	w := linkArguments at: #width ifAbsent: [nil].
	h := linkArguments at: #height ifAbsent: [nil].

	link := AHSHyperGraphicLinkObject
		newGraphicLink:graphicKey
		caption:(linkArguments at: #caption ifAbsent: [''])
		proportion:(linkArguments at: #proportion ifAbsent: [1.0])
		extent:((w isNil or: [h isNil]) ifTrue: [nil] ifFalse: [w@h]).

	^ArborHyperlinkAssociation value: link</body>

<body package="VWHelp" selector="createHyperExample:">createHyperExample: linkArguments

	"linkArguments is a dictionary with tags as the keys.  
	Answer the hyperlink, or nil if one can't be created."

	| link absFilename portableDir aDir |
	link := AHSHelpHyperLinkObject newForType: (linkArguments at: #href).
	link isNil ifTrue: [^nil].
	linkArguments keysAndValuesDo:
		[:id :value |
		id = #exampleFile 
		ifTrue:
			[ portableDir := PortableFilename fromComponents: #('$(VISUALWORKS)' 'examples').
			  aDir := (SystemUtils makeFilenamePortable:portableDir asString) asFilename.
			 absFilename := aDir construct:value.
			 link attributeAt: id put:absFilename asString]].

	^ArborHyperlinkAssociation value: link</body>

<body package="VWHelp" selector="createHyperLink:">createHyperLink: linkArguments

	"linkArguments is a dictionary with tags as the keys.  
	Answer the hyperlink, or nil if one can't be created."

	| link |
	link := AHSHelpHyperLinkObject newForType: (linkArguments at: #href).
	link isNil ifTrue: [^nil].
	linkArguments keysAndValuesDo:
		[:id :value |
		id = #topicNumber ifTrue: [link attributeAt: id put: value].
		id = #xmlFile ifTrue:[link attributeAt: #outlineName put: value]].

	^ArborHyperlinkAssociation value: link</body>

<body package="VWHelp" selector="setTopicID">setTopicID

	"First extract then set the unique ID for the current topic. ID is needed to
	 enable HyperText linking"

	| topic uniqueID topicNode |
	topicNode := self topicTree data topic.
	topic := topicNode characterData trimExteriorCRs. 
	topic isEmpty 
	ifTrue:
		[topic := self extractTopicText:topicNode].

	(uniqueID := self extractUniqueID:topicNode) isNil
	ifFalse:
		[self topicTree data uniqueID: uniqueID.
		 self topicTree data topic:topic.
		 self topicTree data text:' ' asAHSHyperText]
	ifTrue:
		[self error:'Unable to extract Topic ID']</body>

<body package="VWHelp" selector="startNewTopic">startNewTopic

	| lastTree |
	lastTree := self topicTree.
	self topicTree: AHSTree new.
	self topicTree data: AHSHelpOutlineEntry new.
	self topicName: (TextStream on:(String new)).

	"Stick the new tree in it's proper location according to topicDepth and the last tree."
	"Check if lastTree depth is greater, not just equal to topicDepth"
	[lastTree notNil and: [(self treeDepths at: lastTree) &gt;= self topicDepth]] 
	whileTrue: 
			[lastTree := lastTree parent].

	lastTree isNil
	ifTrue:
		[self xmlOutline addLast: self topicTree]
	ifFalse:
		[lastTree addChild: self topicTree].</body>

<body package="VWHelp" selector="storeTopicName:">storeTopicName:topicElement

	"The end of the topic name has been reached, store it in the current topicTree."

	self topicTree data topic: topicElement.
	self treeDepths 
		at: self topicTree 
		put: self topicDepth.
	self topicName: nil.</body>
</methods>

<methods>
<class-id>VWHelp.Outline</class-id> <category>extracting-elements</category>

<body package="VWHelp" selector="extractHyperLink:">extractHyperLink:element

	| linkArguments newLink exampleName |
	(linkArguments := element getLinkAttribute:'href' default:nil) isNil
	ifFalse:
		[ element tag = HyperExample tag
		 ifTrue:[newLink := self createHyperExample:linkArguments.
			     exampleName := element characterData trimExteriorCRs.
			    newLink isNil ifFalse:[newLink value exampleClass:exampleName].
			^( exampleName asAHSHyperText addHyperlink:newLink)]
		ifFalse:
			[element tag = HyperGraphic tag
			ifTrue:
				[self graphicTable add:(linkArguments at:#graphicAssoc).
				newLink := self createGraphicLink:linkArguments.
				 ^((linkArguments at:#href) asString asAHSHyperText addHyperlink:newLink)]
			ifFalse:
				[newLink := self createHyperLink:linkArguments.
				^(element characterData asAHSHyperText addHyperlink:newLink) trimExteriorCRs]]]
	ifTrue:[^nil]</body>

<body package="VWHelp" selector="extractHyperText:">extractHyperText: anElement 
	"extract hyperlink information from link elements"

	anElement isLinkElement
	ifTrue: [^self extractHyperLink: anElement]
	ifFalse:[^nil]</body>

<body package="VWHelp" selector="extractTopicText:">extractTopicText:topicNode

	topicNode elements do:
		[:elm | 
		(elm tag = Anchor tag) 
		ifTrue:
			[elm attributes do:
				[:attr | ('pgfId*' match:(attr value)) 
				ifFalse:[ ^attr value trimExteriorCRs]]]].</body>

<body package="VWHelp" selector="extractUniqueID:">extractUniqueID:topicNode

	"Extract the ID attribute value from an anchor element"

	| topicID |
	topicNode elements do:
		[:elm |
		elm tag = Anchor tag
		ifTrue:
			[topicID := (elm getAttribute:'ID' default:nil).
			topicID isNil ifFalse:[^topicID]]].
	^topicNode characterData trimExteriorCRs.</body>
</methods>

<methods>
<class-id>VWHelp.Outline</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="initialize">initialize

	super initialize.
	stepIndex := 1.
	treeDepths := Dictionary new.
	topicDir := ''.
	topicName := nil.
	topicDepth := 0.
	graphicTable := Dictionary new.</body>
</methods>

<methods>
<class-id>VWHelp.Outline class</class-id> <category>instance creation</category>

<body package="VWHelp" selector="new">new

	^super new initialize.</body>
</methods>

<methods>
<class-id>VWHelp.Outline class</class-id> <category>class initialization</category>

<body package="VWHelp" selector="initialize">initialize

	"Outline initialize"
	TopicContentsTagList := List new.
	TopicContentsTagList add:'Body1';
						add:'DIV';
						add:'StepStart';
						add:'StepCont';
						add:'Bullet1';
						add:'CodeSample';
						add:'DefItem';
						add:'DefDscrp'.</body>
</methods>

<methods>
<class-id>VWHelp.Outline class</class-id> <category>accessing</category>

<body package="VWHelp" selector="topicContentsTagList">topicContentsTagList

	^TopicContentsTagList</body>
</methods>

<methods>
<class-id>VWHelp.Reader</class-id> <category>file scanning</category>

<body package="VWHelp" selector="addFile:">addFile: aString

	"Add aString to my files.
	The string is only held weakly, so the entry will disappear
	when the client no longer holds onto it; the client is expected
	to hold the string strongly. Answer the fileIndex."

	"Scan for the highest current index and increment."

	| highestIndex |
	files isNil ifTrue:[self initialize].
	highestIndex := 0.
	files keys do:
		[:int |
		highestIndex := int max: highestIndex].
	highestIndex := highestIndex + 1.

	"Register the pathname."
	files at: highestIndex put: aString.
	^highestIndex</body>

<body package="VWHelp" selector="currentBookTarget:">currentBookTarget: fileIndex

	"Open the indicated XML file in read-only mode.If a different file is open, close it.
	Once you have scanned the document, extract the title and return a Book with
	this title"

	| parser doc title aStream |
	currentTarget ~~ fileIndex
	ifTrue:
		[self close.
		parser := XMLParser new.
		parser builder: HelpNodeBuilder new.
		parser on: ((files at: fileIndex) asFilename  withEncoding: #UTF_8) readStream.
		parser validate: false.
		doc := parser prolog documentNode.
		doc elements
			do:[:anElm | 
				aStream := anElm text readStream.
				aStream reset.
				aStream skipToAll:'title'.
				((aStream position + 7) &gt; aStream size)
				ifFalse:[aStream position:aStream position + 7.
						title := aStream upToAll:'"']].
				(title isNil or:[title isEmpty])
				ifFalse:
					[currentTarget := fileIndex.
					^Book title:title fileID:(files at:fileIndex) contents:nil]].
	^nil</body>

<body package="VWHelp" selector="currentTarget">currentTarget

	"Answer the fileIndex for currently open data stream."

	^currentTarget</body>

<body package="VWHelp" selector="proxyFromFile:">proxyFromFile: fileIndex

	"Scan for a book and return a Proxy on the book."

	| aBook |
	(aBook := self currentBookTarget: fileIndex) notNil
	ifTrue:[^(Proxy with: aBook)
			fileIndex: currentTarget].
	^nil</body>

<body package="VWHelp" selector="removeFile:">removeFile:fileIndex

	"Remove the fileString pointed to by fileIndex from my files"
	files isNil ifTrue:[self initialize].
	files removeKey:fileIndex ifAbsent:[self error:'Nothing to remove']</body>
</methods>

<methods>
<class-id>VWHelp.Reader</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="close">close

	currentTarget := nil.</body>

<body package="VWHelp" selector="initialize">initialize

	files := WeakDictionary new.</body>
</methods>

<methods>
<class-id>VWHelp.Reader</class-id> <category>private</category>

<body package="VWHelp" selector="extractTitle:">extractTitle:titleElement

	^(titleElement characterData trimExteriorCRs asAHSHyperText allBold)</body>
</methods>

<methods>
<class-id>VWHelp.Proxy</class-id> <category>testing</category>

<body package="VWHelp" selector="valueIsNil">valueIsNil

	^value isNil</body>
</methods>

<methods>
<class-id>VWHelp.Proxy</class-id> <category>accessing</category>

<body package="VWHelp" selector="displayString">displayString

	displayString isEmpty
	ifTrue: [self updateDisplayString].
	^displayString</body>

<body package="VWHelp" selector="displayString:">displayString: aString

	displayString := aString</body>

<body package="VWHelp" selector="fileIndex">fileIndex

	^fileIndex</body>

<body package="VWHelp" selector="fileIndex:">fileIndex: anInteger

	fileIndex := anInteger.</body>

<body package="VWHelp" selector="value">value

	"If my value is not nil, answer that value. Otherwise, attempt
	to fetch the value from the data stream."

	value isNil
	ifTrue:
		[DefaultStorer refresh: self.
		self updateDisplayString].
	^value</body>
</methods>

<methods>
<class-id>VWHelp.Proxy</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="initialize">initialize

	super initialize.
	displayString := ''.</body>

<body package="VWHelp" selector="updateDisplayString">updateDisplayString

	"Get my value's displayString. If my value returns nil	
	as its displayString, take it as a hint to leave my displayString
	unchanged, which gives the application control over it."

	| newString |
	value notNil
	ifTrue:
		[(newString := value displayString) notNil
		ifTrue:
			[self displayString: newString]]</body>
</methods>

<methods>
<class-id>VWHelp.Proxy</class-id> <category>copying</category>

<body package="VWHelp" selector="postCopy">postCopy

	"In addition to the inherited actions on a new copy, copy my value."
	super postCopy.
	self value: self value copy.</body>
</methods>

<methods>
<class-id>VWHelp.Proxy</class-id> <category>converting</category>

<body package="VWHelp" selector="asText">asText

	^displayString asText</body>
</methods>

<methods>
<class-id>VWHelp.Proxy</class-id> <category>comparing</category>

<body package="VWHelp" selector="&lt;=">&lt;= aProxy

	^self displayString &lt;= aProxy displayString</body>
</methods>

<methods>
<class-id>VWHelp.Proxy class</class-id> <category>instance creation</category>

<body package="VWHelp" selector="displayString:position:">displayString: aString position: anInteger

	^self new displayString: aString</body>

<body package="VWHelp" selector="with:">with: initialValue

	"Set the display string of the inherited instance -- this assumes that the
	initialValue implements #displayString for list displaying."

	^(super with: initialValue)
		updateDisplayString.</body>
</methods>

<methods>
<class-id>VWHelp.Proxy class</class-id> <category>accessing</category>

<body package="VWHelp" selector="defaultStorer">defaultStorer

	^DefaultStorer</body>

<body package="VWHelp" selector="defaultStorer:">defaultStorer: aStorageMgr

	DefaultStorer := aStorageMgr</body>
</methods>

<methods>
<class-id>VWHelp.Proxy class</class-id> <category>class initialization</category>

<body package="VWHelp" selector="initialize">initialize

	"Proxy initialize"

	DefaultStorer := Reader new.</body>
</methods>

<methods>
<class-id>VWHelp.HelpElement</class-id> <category>accessing</category>

<body package="VWHelp" selector="emphasis">emphasis
	
	"Default is no emphasis"
	^#()</body>

<body package="VWHelp" selector="tag">tag

	^tag type</body>
</methods>

<methods>
<class-id>VWHelp.HelpElement</class-id> <category>testing</category>

<body package="VWHelp" selector="isHeadingElement">isHeadingElement
	
	^false</body>

<body package="VWHelp" selector="isLinkElement">isLinkElement
	
	^false</body>

<body package="VWHelp" selector="isListElement">isListElement
	
	^false</body>

<body package="VWHelp" selector="isStartElement">isStartElement
	
	^false</body>
</methods>

<methods>
<class-id>VWHelp.HelpElement</class-id> <category>formatting</category>

<body package="VWHelp" selector="formatText">formatText

	^((self characterData asAHSHyperText trimExteriorCRs)
		addEmphasis:self emphasis removeEmphasis: #() allowDuplicates: false)</body>

<body package="VWHelp" selector="formatText:">formatText:aText

	^((aText asAHSHyperText trimExteriorCRs)
		addEmphasis:self emphasis removeEmphasis: #() allowDuplicates: false)</body>
</methods>

<methods>
<class-id>VWHelp.HelpElement</class-id> <category>initializing</category>

<body package="VWHelp" selector="initialize">initialize
	
	super initialize.</body>
</methods>

<methods>
<class-id>VWHelp.HelpElement class</class-id> <category>defaults</category>

<body package="VWHelp" selector="defaultColorValueClass">defaultColorValueClass

	"Use Arbor's reversible color value if possible (which reverses its color when highlighted), 
	otherwise use ColorValue."


	#{ArborReversibleColorValue} isDefined 
	ifTrue: [^#{ArborReversibleColorValue} value].
	^ColorValue</body>
</methods>

<methods>
<class-id>VWHelp.HelpElement class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	
	^nil</body>
</methods>

<methods>
<class-id>VWHelp.Bold</class-id> <category>accessing</category>

<body package="VWHelp" selector="emphasis">emphasis

	^(Array with:#bold)</body>
</methods>

<methods>
<class-id>VWHelp.Bold class</class-id> <category>class initialization</category>

<body package="VWHelp" selector="initialize">initialize

	"self initialize"
	BoldTags := List new.
	BoldTags add:'B';
			   add:'Emphasis';
			   add:'NewTerm';
			   add:'New-Term'.</body>
</methods>

<methods>
<class-id>VWHelp.Bold class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	
	^BoldTags</body>
</methods>

<methods>
<class-id>VWHelp.Code</class-id> <category>accessing</category>

<body package="VWHelp" selector="color">color

	^self class defaultColorValueClass darkMagenta</body>

<body package="VWHelp" selector="emphasis">emphasis

	^(Array with:#color-&gt;self color)</body>
</methods>

<methods>
<class-id>VWHelp.Code class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^'Code'</body>
</methods>

<methods>
<class-id>VWHelp.ListElement</class-id> <category>accessing</category>

<body package="VWHelp" selector="emphasis">emphasis

	^Array with:self indentEmphasis</body>

<body package="VWHelp" selector="indentEmphasis">indentEmphasis

	^AHSIndentableComposedText indentKey-&gt;1</body>

<body package="VWHelp" selector="itemStart">itemStart

	^itemStart</body>

<body package="VWHelp" selector="itemStart:">itemStart:aBoolean

	itemStart := aBoolean</body>

<body package="VWHelp" selector="prependEmphasis">prependEmphasis

	^(Array with:#bold with:#large with:AHSIndentableComposedText indentKey-&gt;(0.5))</body>
</methods>

<methods>
<class-id>VWHelp.ListElement</class-id> <category>formatting</category>

<body package="VWHelp" selector="formatText:">formatText:aText

	^aText trimExteriorCRs asAHSHyperText
		addEmphasis:self emphasis removeEmphasis: #() allowDuplicates: false.</body>

<body package="VWHelp" selector="paragraphSpacing">paragraphSpacing
	^false</body>

<body package="VWHelp" selector="prependText">prependText

	"A list element is by default an Unordered List"
	| prependString retText |
	itemStart
	ifFalse:[prependString := '']
	ifTrue:[prependString := '· '].
	retText := prependString asAHSHyperText
				addEmphasis:self prependEmphasis 
				removeEmphasis: #() 
				allowDuplicates: false.
	itemStart := false.
	^retText</body>
</methods>

<methods>
<class-id>VWHelp.ListElement</class-id> <category>testing</category>

<body package="VWHelp" selector="isListElement">isListElement

	^true</body>

<body package="VWHelp" selector="isOrderedListElement">isOrderedListElement

	^false</body>

<body package="VWHelp" selector="isStartElement">isStartElement

	^true</body>
</methods>

<methods>
<class-id>VWHelp.ListElement class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^'Bullet1'</body>
</methods>

<methods>
<class-id>VWHelp.OrderedListElement</class-id> <category>accessing</category>

<body package="VWHelp" selector="index">index

	^index</body>

<body package="VWHelp" selector="index:">index:aValue

	index := aValue</body>
</methods>

<methods>
<class-id>VWHelp.OrderedListElement</class-id> <category>formatting</category>

<body package="VWHelp" selector="paragraphSpacing">paragraphSpacing
	^true</body>

<body package="VWHelp" selector="prependEmphasis">prependEmphasis

	^(Array with:#bold  with:AHSIndentableComposedText indentKey-&gt;(0.5))</body>

<body package="VWHelp" selector="prependText">prependText
	| prependString retText |
	itemStart
	ifFalse:[prependString := '']
	ifTrue:[prependString := index printString, '. '].
	retText := prependString asAHSHyperText
				addEmphasis:self prependEmphasis 
				removeEmphasis: #() 
				allowDuplicates: false.
	itemStart := false.
	^retText</body>
</methods>

<methods>
<class-id>VWHelp.OrderedListElement</class-id> <category>testing</category>

<body package="VWHelp" selector="isOrderedListElement">isOrderedListElement

	^true</body>
</methods>

<methods>
<class-id>VWHelp.OrderedListElement class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	^nil</body>
</methods>

<methods>
<class-id>VWHelp.ListCont class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^'StepCont'</body>
</methods>

<methods>
<class-id>VWHelp.UILabel</class-id> <category>accessing</category>

<body package="VWHelp" selector="emphasis">emphasis

	^(Array with:#bold)</body>
</methods>

<methods>
<class-id>VWHelp.UILabel class</class-id> <category>initializing</category>

<body package="VWHelp" selector="initialize">initialize

	"self initialize"

	UILabelTags := List new.
	UILabelTags add:'UILabel-Table';
				add:'UILabel';
				add:'UI-Label';
				add:'UIEntry';
				add:'UI-Entry'.</body>
</methods>

<methods>
<class-id>VWHelp.UILabel class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^UILabelTags</body>
</methods>

<methods>
<class-id>VWHelp.HyperLink</class-id> <category>testing</category>

<body package="VWHelp" selector="isLinkElement">isLinkElement
	^true</body>
</methods>

<methods>
<class-id>VWHelp.HyperLink</class-id> <category>private</category>

<body package="VWHelp" selector="getLinkAttribute:default:">getLinkAttribute: attName default: def

	| att |
	att := self attributes detect:[:attr | attr key type = attName]
						ifNone: [nil].
	^att == nil
		ifTrue: [def]
		ifFalse: [self parseLink:att value]</body>

<body package="VWHelp" selector="parseLink:">parseLink:aValue
	
	self subclassResponsibility</body>
</methods>

<methods>
<class-id>VWHelp.HyperLink</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="initialize">initialize

	super initialize.
	linkArguments := Dictionary new.</body>
</methods>

<methods>
<class-id>VWHelp.HyperLink</class-id> <category>accessing</category>

<body package="VWHelp" selector="linkArguments">linkArguments

	^linkArguments</body>
</methods>

<methods>
<class-id>VWHelp.HyperLink class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	^nil</body>
</methods>

<methods>
<class-id>VWHelp.HyperExample</class-id> <category>private</category>

<body package="VWHelp" selector="parseLink:">parseLink:aValue
	
	aValue isNil
		ifTrue:[self error:'Unable to extract Example Information from Tag']
		ifFalse:
			[linkArguments at:#href put:'example'.
			linkArguments at:#exampleFile put:aValue.
			^linkArguments]</body>
</methods>

<methods>
<class-id>VWHelp.HyperExample class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^'CodeExample'</body>
</methods>

<methods>
<class-id>VWHelp.HyperGraphic</class-id> <category>private</category>

<body package="VWHelp" selector="parseLink:">parseLink:aValue
	
	| graphicName |
	 graphicName := aValue readStream  upTo:$..
	
	graphicName isNil
		ifTrue:[self error:'Unable to extract Graphic Information from Tag']
		ifFalse:
			[linkArguments at:#href put:aValue.
			  linkArguments at:#graphicAssoc 
					put:(Association key: graphicName asSymbol value: aValue).
			^linkArguments]</body>
</methods>

<methods>
<class-id>VWHelp.HyperGraphic class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	
	^'IMAGE'</body>
</methods>

<methods>
<class-id>VWHelp.ListStart class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^'StepStart'</body>
</methods>

<methods>
<class-id>VWHelp.OutlineEntry</class-id> <category>accessing</category>

<body package="VWHelp" selector="outlineFile">outlineFile

	^outlineFile</body>

<body package="VWHelp" selector="outlineFile:">outlineFile:aString

	outlineFile := aString</body>

<body package="VWHelp" selector="proxy">proxy

	^proxy</body>

<body package="VWHelp" selector="proxy:">proxy:aProxyObject

	proxy := aProxyObject</body>
</methods>

<methods>
<class-id>VWHelp.GlossaryEntry</class-id> <category>accessing</category>

<body package="VWHelp" selector="color">color

	^self class defaultColorValueClass darkRed</body>

<body package="VWHelp" selector="emphasis">emphasis

	^(Array with:#italic)</body>
</methods>

<methods>
<class-id>VWHelp.GlossaryEntry class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^'Glossary'</body>
</methods>

<methods>
<class-id>VWHelp.Heading</class-id> <category>testing</category>

<body package="VWHelp" selector="isHeadingElement">isHeadingElement
	^true</body>
</methods>

<methods>
<class-id>VWHelp.Heading class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^nil</body>
</methods>

<methods>
<class-id>VWHelp.Heading1 class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	^'Heading1'</body>
</methods>

<methods>
<class-id>VWHelp.Heading4 class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	^'Heading4'</body>
</methods>

<methods>
<class-id>VWHelp.Heading2 class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	^'Heading2'</body>
</methods>

<methods>
<class-id>VWHelp.HyperExampleLinkObject</class-id> <category>accessing</category>

<body package="VWHelp" selector="exampleClass">exampleClass

	^exampleClass</body>

<body package="VWHelp" selector="exampleClass:">exampleClass: aValue

	exampleClass := aValue</body>

<body package="VWHelp" selector="exampleFile">exampleFile 

	^self linkObject first</body>

<body package="VWHelp" selector="exampleFile:">exampleFile: aStringOrNil 

	self linkObject at: 1 put: aStringOrNil.</body>
</methods>

<methods>
<class-id>VWHelp.HyperExampleLinkObject</class-id> <category>attributes</category>

<body package="VWHelp" selector="attributes">attributes

	^super attributes, #(exampleFile)</body>
</methods>

<methods>
<class-id>VWHelp.HyperExampleLinkObject</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="initialize">initialize
	super initialize.
	self linkObject: (Array with: nil)</body>
</methods>

<methods>
<class-id>VWHelp.HyperExampleLinkObject</class-id> <category>engaging</category>

<body package="VWHelp" selector="engageFor:">engageFor: anObject
	"The hyperlink has been engaged within the context of anObject."

	| class |
	(self exampleClass asQualifiedReference home: Examples) isDefined ifFalse:
		[class := [Parcel loadParcelFrom: self exampleFile asFilename]
		 	on: Error
		 	do: [:ex | 
				Dialog warn: 
					('Example class &lt;1s&gt; could not be loaded.' 
						expandMacrosWith: self exampleClass).
				ex return: nil].
		class isNil ifTrue: [^nil]].
	Cursor wait showWhile:
		[class := (self exampleClass asQualifiedReference home: Examples) value.
		class isBehavior ifFalse: [^nil].
		(class respondsTo: #open)
			ifTrue: [class open]
			ifFalse: [class browse]]</body>
</methods>

<methods>
<class-id>VWHelp.HyperExampleLinkObject class</class-id> <category>attributes</category>

<body package="VWHelp" selector="defaultColor">defaultColor

	^self defaultColorValueClass blue</body>

<body package="VWHelp" selector="type">type
	"Answer a unique identifier for the type"

	^#example</body>
</methods>

<methods>
<class-id>VWHelp.Book</class-id> <category>private</category>

<body package="VWHelp" selector="buildOutline">buildOutline

	"If this is the first time accessing this outline then first scan the xml file to build
	a XML Document and then parse it to build a Help Outline"

	| outline outInst |	
	self contents isNil
	ifTrue:[Transcript cr; show:'Building Help Index..'.
			self contents:(self scanxmlFile:self fileID)].	
	(self contents isKindOf:AHSOutline)
		ifFalse:
			[outInst := Outline new.
			outInst topicDir: self fileID asLogicalFileSpecification directory.
			outline := outInst buildOutlineFrom:self contents.
			self contents:outline xmlOutline.
			self readGraphicsFor:outline]</body>

<body package="VWHelp" selector="readGraphicsFor:">readGraphicsFor:anOutline
	"Read the graphics using the filenames in the graphicTable."
	| filename image grfDir|
	grfDir := anOutline topicDir asFilename.
	anOutline graphicTable keysAndValuesDo: 
		[:aKey :aValue |
		filename := aValue.
		(filename notNil and: [filename isEmpty not]) ifTrue:
			[filename := grfDir construct: filename.
			filename asFilename exists
				ifTrue: 
					[(image := ImageReader fromFile: filename asFilename) notNil
						ifTrue: 
							[((image image isKindOf: OpaqueImage) or:[image image isKindOf: Image])
								ifTrue: 
									[anOutline xmlOutline graphicsDictionary at: aKey put: image image]]]
				ifFalse: 
					[Dialog warn: 'Cannot find the graphic file ' , filename asString.
					anOutline xmlOutline 
						graphicsDictionary at: aKey 
						put: 'graphic not found' asText asComposedText]]].</body>

<body package="VWHelp" selector="scanxmlFile:">scanxmlFile:aFile

	"Open the indicated XML file in read-only mode. Once you have scanned the document, extract 
	the  doc contents"

		| parser doc |
		parser := XMLParser new.
		parser builder: HelpNodeBuilder new.
		parser on: (aFile asFilename  withEncoding: #UTF_8) readStream.
		parser validate: false.
		doc := parser scanDocument.
		(doc root elements 
			detect:[:anElm | 
				anElm tag  = Heading1 tag] ifNone:[nil]) 
			notNil 
			ifTrue:[^doc root].
		^nil</body>
</methods>

<methods>
<class-id>VWHelp.Book</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="initialize">initialize

	super initialize.
	fileID := ''.
	contents := OrderedCollection new.</body>
</methods>

<methods>
<class-id>VWHelp.Book</class-id> <category>testing</category>

<body package="VWHelp" selector="contains:">contains: anElement
	"Answer whether anOutline is one of my topics."
	
	^self contents includes: anElement</body>
</methods>

<methods>
<class-id>VWHelp.Book</class-id> <category>accessing</category>

<body package="VWHelp" selector="fileID">fileID

	^fileID</body>

<body package="VWHelp" selector="fileID:">fileID: aString

	fileID := aString</body>

<body package="VWHelp" selector="library">library

	^Library default</body>
</methods>

<methods>
<class-id>VWHelp.Book class</class-id> <category>instance-creation</category>

<body package="VWHelp" selector="title:fileID:contents:">title: aString fileID: fileID contents: aDoc

	^self new 
		title: aString;
		fileID: fileID;
		contents: aDoc.</body>
</methods>

<methods>
<class-id>Examples.ExamplesBrowser class</class-id> <category>accessing</category>

<body package="VWHelp" selector="prepareScratchWindow">prepareScratchWindow
	"Make sure the scratch window is open, expanded and has the
	default size, in preparation for example code to display on it."

	^self prepareScratchWindowOfSize: 400@400.</body>

<body package="VWHelp" selector="prepareScratchWindowOfSize:">prepareScratchWindowOfSize: windowExtent
	"Make sure the scratch window is open, expanded and has the
	specified size, in preparation for example code to display on it."

	ScratchWindow isOpen
		ifTrue: 
			["Resize if necessary."
			ScratchWindow extent ~= windowExtent ifTrue:
				[|newDisplayBox screenBox|
				ScratchWindow sensor skipNextDamage.
				newDisplayBox := ScratchWindow displayBox origin extent: windowExtent.
				screenBox := Screen default preferredRectangleToConstrain: newDisplayBox.
				newDisplayBox 
					insetOriginBy: ScratchWindow class windowTopLeftHeadroom
					cornerBy: 0@0.
				newDisplayBox := newDisplayBox translatedBy: (newDisplayBox amountToTranslateWithin: screenBox).
				ScratchWindow displayBox: newDisplayBox].

			"Expand if necessary."
			ScratchWindow isCollapsed ifTrue:
				[ScratchWindow sensor skipNextDamage.
				ScratchWindow expand].

			"Erase."
			ScratchWindow display]
		ifFalse: 
			[ScratchWindow sensor skipNextDamage.
			ScratchWindow openIn: (ScratchWindow class windowTopLeftHeadroom extent: windowExtent)].

	^ScratchWindow</body>

<body package="VWHelp" selector="scratchWindow">scratchWindow
	^ScratchWindow</body>
</methods>

<methods>
<class-id>Examples.ExamplesBrowser class</class-id> <category>class initialization</category>

<body package="VWHelp" selector="initialize">initialize
	"ExamplesBrowser initialize"
	ScratchWindow := ApplicationWindow new label: 'Scratch Window'.
	ScratchWindow component: ComposingComposite new</body>
</methods>

<methods>
<class-id>VWHelp.CodeEmphasis</class-id> <category>accessing</category>

<body package="VWHelp" selector="emphasis">emphasis

	^(Array with:#bold with:#color-&gt;self color)</body>
</methods>

<methods>
<class-id>VWHelp.CodeEmphasis class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^'CodeEmp'</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser</class-id> <category>accessing</category>

<body package="VWHelp" selector="helpDir">helpDir

	^helpDir isEmpty
		ifTrue: [nil]
		ifFalse: [helpDir asLogicalFileSpecification].</body>

<body package="VWHelp" selector="helpDir:">helpDir: pathString

	"Set my data directory, and load books from that directory into my library."

	helpDir := pathString.
	self loadBooksFromDirectory: helpDir into: self library.</body>

<body package="VWHelp" selector="library">library

	^library</body>

<body package="VWHelp" selector="library:">library:aLibrary

	library := aLibrary</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser</class-id> <category>file management</category>

<body package="VWHelp" selector="registerFile:forBook:">registerFile: pathString forBook: aBook

	"Register the file named by pathString with the storer. Create a 
	strong pointer to the returned stream, and answer the returned fileIndex."

	pathnames add: pathString.
	^self storer addFile: pathString.</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="initialize">initialize

	super initialize.
	"Use the default directory, settable via Settings."
	helpDir := DefaultDir.

	"Initialize the repository for strong references to data files."
	pathnames := Set new.</body>

<body package="VWHelp" selector="loadBooksFromDirectory:into:">loadBooksFromDirectory: pathString into: aLibrary

	"Scan the named directory for book files and load each book into aLibrary. 
	Data files are expected to have a .xml extension. Answer true if one or
	more books were found."

	| dir bookFiles list storer fileIndex bk newTitles browsers oc dirs aFile |
	(pathString isNil or: [pathString isEmpty])
		ifTrue: [^false].
	dir := pathString asLogicalFileSpecification.

	dir definitelyExists ifFalse: [^Dialog warn: 'Directory ''', (dir asString), ''' does not exist.'].
	dir isDirectory 
		ifFalse: [^Dialog warn: '"' , dir asString , '" is not a directory.']

		ifTrue:[oc := dir directoryContents asSortedCollection 
				collect:[:fileString | dir construct: fileString]].
	dirs := oc select:[:item | item isDirectory].
	dirs isEmpty ifTrue:[^false].

	list := List new.
	dirs do:[:aDir | 
			bookFiles := aDir directoryContents 
				select: [ :fname | '*.xml' match: fname asString].
		bookFiles isEmpty
		ifFalse:[
		storer := self storer.
	
		"Close any open browsers, to avoid smashing file pointers."
		browsers := (self class allInstances)
			select: [ :brwsr | brwsr builder ~~ nil].
		
		browsers isEmpty
		ifFalse:
			[ browsers do: [:brwsr | 
					brwsr builder window isOpen
					ifTrue:[
						Dialog warn: 'The Online Documentation window will be closed.'].
					brwsr closeRequest]].

	Cursor wait showWhile: [
		bookFiles do: [ :fname |
		aFile := aDir constructString: fname.

		fileIndex := self 
			registerFile:aFile
			forBook: nil.

		bk := storer proxyFromFile: fileIndex.

		bk notNil 
		ifTrue:[(bk value fileID match: aFile)
				ifFalse: [bk value fileID: aFile].
			   list add: bk]
		ifFalse:[storer removeFile:fileIndex].
		storer close]]]].

	"Merge the new books into the library, favoring new books when 
	same-title conflicts arise."
	newTitles := list collect: [:newBook | newBook displayString].
	aLibrary contents do: [ :oldBook |
		(newTitles includes: oldBook displayString)
			ifFalse: [list add: oldBook]].
	aLibrary contents: list.
	^true</body>

<body package="VWHelp" selector="release">release

	super release.
	self storer close.</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser</class-id> <category>private</category>

<body package="VWHelp" selector="storer">storer
	^Proxy defaultStorer</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser class</class-id> <category>accessing</category>

<body package="VWHelp" selector="defaultDir">defaultDir

	^DefaultDir</body>

<body package="VWHelp" selector="defaultDir:">defaultDir: aString

	"Set the default data directory, and initialize the default library's collection of books."
	
	DefaultDir := aString.
	Cursor wait showWhile:[
	^self basicNew initialize;
			loadBooksFromDirectory: DefaultDir 
			into: Library default].</body>

<body package="VWHelp" selector="multipleHelpBrowsers">multipleHelpBrowsers

	^MultipleHelpBrowsers</body>

<body package="VWHelp" selector="multipleHelpBrowsers:">multipleHelpBrowsers: aBoolean

	"Set opening of multiple help browsers. Default is false"
	MultipleHelpBrowsers := aBoolean.</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser class</class-id> <category>parcel load/unload</category>

<body package="VWHelp" selector="postLoadSetUp">postLoadSetUp

	"Attempt to set-up the help directory.  If $(VISUALWORKS)/help exists
	 then set it as the default help direcotry."

	#{UISettings} value addPreferenceSection: #addAHSSectionTo:development:runtime:.
	#{UISettings} value updateAllPreferences.</body>

<body package="VWHelp" selector="preUnloadFor:">preUnloadFor: theHelpParcel

	"Close the HelpBrowser if it is open."

	#{ApplicationModel} ifDefinedDo:
		[:appModel | appModel checkUnloadOfApplicationsDefinedBy: theHelpParcel]</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser class</class-id> <category>opening</category>

<body package="VWHelp" selector="allButOpenOn:">allButOpenOn: aLibrary

	"Create a browser but defer opening it."

	| browser portable dir |
	browser := self on: aLibrary.
	aLibrary listSize == 0
	ifTrue:
		[ portable := PortableFilename fromComponents: #('$(VISUALWORKS)' 'help').
		  dir := (SystemUtils makeFilenamePortable:portable asString) asFilename.
		dir exists
			ifTrue: [self defaultDir: dir asString]
			ifFalse:
			[Dialog warn: '
Please use the Settings tool
to set the help directory. The
Settings tool is accessed via
the Launcher''s ''System'' menu.
'. 
		^self]].
	^browser</body>

<body package="VWHelp" selector="open">open
	self openOn: Library default</body>

<body package="VWHelp" selector="openOn:">openOn: aLibrary

	"Open the browser window on the default Help library. If MultipleHelpBrowsers
	is false, check for open Help Viewer "

	| browser helpView |
	browser := self allButOpenOn: aLibrary.
	browser == self 
	ifFalse:
		[self multipleHelpBrowsers 
		ifFalse:
			[helpView := nil.
			self allInstances size = 0 
			ifFalse: 
				[ScheduledControllers scheduledControllers 
				do: [:c | 
					[(c model isKindOf: AHSOutlineTextGraphicMixViewer) ifTrue: [helpView := c view]]
						on: Object errorSignal 
						do: 
							[:ex | ex return]]].
				helpView isNil
				ifTrue: [Cursor execute showWhile: [self openOnLibrary]]
				ifFalse: [helpView isCollapsed
					ifTrue: [helpView expand]
					ifFalse: [helpView raise]]]
		ifTrue:[self openOnLibrary]]</body>

<body package="VWHelp" selector="openOnBook:topic:">openOnBook: bookName topic: topicName
	"Open the browser window on the specified book and topic.
	Use the default Help library, and if MultipleHelpBrowsers is false,
	check for an open Help Viewer and use it to display the topic."
	"HelpBrowser openOnBook: 'VisualWorks Tools' topic: 'Inspector' "

	| browser helpView viewer helpFile |
	browser := self allButOpenOn: Library default.
	browser == self 
	ifFalse:
		[self multipleHelpBrowsers 
		ifFalse:
			[helpView := nil.
			self allInstances size = 0 
			ifFalse: 
				[ScheduledControllers scheduledControllers 
				do: [:c | 
					[(c model isKindOf: AHSOutlineTextGraphicMixViewer)
							ifTrue:	[helpView := c view.
									viewer := c model]]
						on: Object errorSignal 
						do: 
							[:ex | ex return]]].
				helpView isNil
				ifTrue:	["didn't find one open already -- open it now"
						Cursor execute showWhile: [self openOnLibrary]]
				ifFalse:	[helpView isCollapsed
					ifTrue: [helpView expand]
					ifFalse: [helpView raise]]]
		ifTrue: ["multiple browsers are allowed -- open a new one"
				self openOnLibrary]].

	viewer isNil
		ifTrue:	["just opened a new one -- now find the viewer"
				ScheduledControllers scheduledControllers 
					do: [:c | 
						[(c model isKindOf: AHSOutlineTextGraphicMixViewer) ifTrue: [viewer := c model]]
							on: Object errorSignal 
							do:	[:ex | ex return]]].

	"get the name of the help file, i.e., the outline"
	helpFile := (Library default bookNamed: bookName) value fileID asLogicalFileSpecification tail.

	"jump to our destination"
	viewer jumpToOutline: helpFile topic: topicName.</body>

<body package="VWHelp" selector="openOnLibrary">openOnLibrary
	"Create a new AHSOutline with new OutlineEntries for each of the books in the default Help library"

	|recursionBlock root tree |
	recursionBlock := [:parentTree :aLib |
		aLib do:[:aBook |  
			parentTree addChild:(tree:= (AHSTree data: (OutlineEntry new topic: aBook value  title; text: aBook value title; uniqueID:'Not Loaded'; proxy:aBook value))).
				tree addChild:(AHSTree data: (AHSHelpOutlineEntry new topic:'Place Holder'; text: 'Not loaded'))]].
	root := AHSTree new.
	Cursor wait showWhile: [
		recursionBlock value: root value: Library default contents].
	(self onOutline: ((AHSOutline withAll: root children) name: 'VisualWorks Help Library')) open window label: 'VisualWorks Help Library'</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser class</class-id> <category>coded resources</category>

<body package="VWHelp" selector="helpIcon">helpIcon

	Screen default colorDepth == 1
		ifTrue: [^VisualLauncher BWHelp32]
		ifFalse: [^VisualLauncher CGHelp32]</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser class</class-id> <category>instance creation</category>

<body package="VWHelp" selector="on:">on: aLibrary

	^self basicNew 
		library: aLibrary;
		initialize</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser class</class-id> <category>private</category>

<body package="VWHelp" selector="obsolete">obsolete
	"The receiver was removed from the system and is now obsolete. Perform any necessary clean-up. Answer the receiver."
	"When the receiver is removed, we disable any notion of it in the main launcher."

	super obsolete.
	#{VisualLauncher} ifDefinedDo:
		[:launcher| launcher checkInstalledComponents]</body>
</methods>

<methods>
<class-id>VWHelp.HelpBrowser class</class-id> <category>initializing</category>

<body package="VWHelp" selector="initialize">initialize

	"HelpBrowser initialize"
	DefaultDir isNil
	ifTrue:
		[DefaultDir := (PortableFilename fromComponents: #('$(VISUALWORKS)' 'help'))].
	MultipleHelpBrowsers isNil ifTrue:[MultipleHelpBrowsers := false].
	#{VisualLauncher} ifDefinedDo:
		[:launcher| launcher checkInstalledComponents]</body>

<body package="VWHelp" selector="new">new

	^super new initialize</body>

<body package="VWHelp" selector="rebuildHelpLibrary">rebuildHelpLibrary

	| choice choiceD |
	choice := PortableFilename fromComponents: #('$(VISUALWORKS)' 'help').
	choice := Dialog
		request: 'Online Help Directory: '
		initialAnswer: choice
		onCancel:[^self].
	choiceD := (SystemUtils makeFilenamePortable:choice) asFilename.
	(choiceD definitelyExists and: [choiceD isDirectory])
		ifFalse: [^Dialog
				warn: choice, ' does not exist. Please try again'
				for: nil]
		ifTrue:[self defaultDir: choice asString]</body>
</methods>

<methods>
<class-id>VWHelp.Body</class-id> <category>testing</category>

<body package="VWHelp" selector="isStartElement">isStartElement

	^true</body>
</methods>

<methods>
<class-id>VWHelp.Body</class-id> <category>formatting</category>

<body package="VWHelp" selector="paragraphSpacing">paragraphSpacing
	^true</body>
</methods>

<methods>
<class-id>VWHelp.Body</class-id> <category>accessing</category>

<body package="VWHelp" selector="emphasis">emphasis

	^Array with:self indentEmphasis</body>

<body package="VWHelp" selector="indentEmphasis">indentEmphasis

	^AHSIndentableComposedText indentKey-&gt;0</body>
</methods>

<methods>
<class-id>VWHelp.Body class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	^'Body1'</body>
</methods>

<methods>
<class-id>VWHelp.Definition</class-id> <category>testing</category>

<body package="VWHelp" selector="isStartElement">isStartElement
	
	^true</body>
</methods>

<methods>
<class-id>VWHelp.Definition</class-id> <category>accessing</category>

<body package="VWHelp" selector="emphasis">emphasis

	^Array with:self indentEmphasis</body>

<body package="VWHelp" selector="indentEmphasis">indentEmphasis

	^AHSIndentableComposedText indentKey-&gt;1</body>
</methods>

<methods>
<class-id>VWHelp.Definition class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	^nil</body>
</methods>

<methods>
<class-id>VWHelp.DefinitionItem class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	^'DefItem'</body>
</methods>

<methods>
<class-id>VWHelp.DefinitionDescription</class-id> <category>formatting</category>

<body package="VWHelp" selector="paragraphSpacing">paragraphSpacing
	^false</body>
</methods>

<methods>
<class-id>VWHelp.DefinitionDescription class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	^'DefDscrp'</body>
</methods>

<methods>
<class-id>VWHelp.PlatformElement</class-id> <category>accessing</category>

<body package="VWHelp" selector="emphasis">emphasis

	^(Array with:#bold)</body>
</methods>

<methods>
<class-id>VWHelp.PlatformElement class</class-id> <category>class initialization</category>

<body package="VWHelp" selector="initialize">initialize

	"self initialize"
	PlatformTags := List new.
	PlatformTags add:'PlatformElement';
				 add:'PlatformElement-Table';
				 add:'Platform'.</body>
</methods>

<methods>
<class-id>VWHelp.PlatformElement class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^PlatformTags</body>
</methods>

<methods>
<class-id>VWHelp.Heading3 class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag
	^'Heading3'</body>
</methods>

<methods>
<class-id>VWHelp.Anchor</class-id> <category>private</category>

<body package="VWHelp" selector="getAttribute:default:">getAttribute: attName default: def


	| att |
	
	att := self attributes detect:[:attr | attr key type = attName] 
						ifNone:[nil].
	^att == nil
		ifTrue:[def]
		ifFalse: [self parseID:att value]</body>

<body package="VWHelp" selector="parseID:">parseID:aValue


	^('pgfId-*' match:aValue)
		ifTrue:[nil]
		ifFalse:[aValue]</body>

<body package="VWHelp" selector="parseLink:">parseLink:aValue
	
	"extract the topicFile and topicID from the href element of an anchor"
	| topicFile topicID |
	topicFile :=  aValue copyUpTo:$#.
	topicID := aValue copyFrom:((aValue indexOf:$()+1) to:(aValue size-1).

	(topicFile isNil or:[topicID isNil])
		ifTrue:[self error:'Unable to extract HyperLink Information from Tag']
		ifFalse:[linkArguments at:#topicNumber put:topicID.
				linkArguments at:#xmlFile put:topicFile.
				linkArguments at:#href put:'text'.
				^linkArguments]</body>
</methods>

<methods>
<class-id>VWHelp.Anchor class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^'A'</body>
</methods>

<methods>
<class-id>VWHelp.CodeSample</class-id> <category>testing</category>

<body package="VWHelp" selector="isStartElement">isStartElement

	^true</body>
</methods>

<methods>
<class-id>VWHelp.CodeSample</class-id> <category>formatting</category>

<body package="VWHelp" selector="paragraphSpacing">paragraphSpacing
	^false</body>
</methods>

<methods>
<class-id>VWHelp.CodeSample</class-id> <category>accessing</category>

<body package="VWHelp" selector="color">color

	^self class defaultColorValueClass darkMagenta</body>

<body package="VWHelp" selector="emphasis">emphasis

	^(Array with:#serif with:self indentEmphasis with:#color-&gt;self color)</body>

<body package="VWHelp" selector="indentEmphasis">indentEmphasis

	^AHSIndentableComposedText indentKey-&gt;(1.5)</body>
</methods>

<methods>
<class-id>VWHelp.CodeSample class</class-id> <category>class initialization</category>

<body package="VWHelp" selector="initialize">initialize

	"self initialize"
	CodeTags := List new.
	CodeTags add:'CodeSample';
			   add:'Smalltalk-Code-Table';
			   add:'Smalltalk-Code'.</body>
</methods>

<methods>
<class-id>VWHelp.CodeSample class</class-id> <category>accessing</category>

<body package="VWHelp" selector="tag">tag

	^CodeTags</body>
</methods>

<methods>
<class-id>VWHelp.Library</class-id> <category>adding</category>

<body package="VWHelp" selector="add:before:">add: newBook before: oldBook

	"Add newBook to the library if its title is unique."

	(self contents includes: newBook)
	ifFalse: 
		[oldBook isNil
		ifTrue:[self contents add: newBook]
		ifFalse: [self contents add: newBook before: oldBook]].</body>
</methods>

<methods>
<class-id>VWHelp.Library</class-id> <category>removing</category>

<body package="VWHelp" selector="remove:">remove: aBook

	self contents 
		remove: aBook 
		ifAbsent: [nil].</body>
</methods>

<methods>
<class-id>VWHelp.Library</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="initialize">initialize

	super initialize.
	contents := OrderedCollection new.</body>
</methods>

<methods>
<class-id>VWHelp.Library</class-id> <category>testing</category>

<body package="VWHelp" selector="contains:">contains: anElement

	^self contents includes: anElement.</body>

<body package="VWHelp" selector="isList">isList

	^true</body>
</methods>

<methods>
<class-id>VWHelp.Library</class-id> <category>accessing</category>

<body package="VWHelp" selector="bookNamed:">bookNamed: aTitle
	"Answer the book identified by aTitle."

	^self contents
		detect: [ :bk | (bk value title findString: aTitle startingAt: 1) &gt; 0]
		ifNone: [nil]</body>
</methods>

<methods>
<class-id>VWHelp.Library class</class-id> <category>class initialization</category>

<body package="VWHelp" selector="initialize">initialize

	"Library initialize."

	SystemDefault := self new
		title: 'VisualWorks Library'</body>
</methods>

<methods>
<class-id>VWHelp.Library class</class-id> <category>accessing</category>

<body package="VWHelp" selector="default">default

	^SystemDefault</body>
</methods>

<methods>
<class-id>Core.Object</class-id> <category>Help Core mods</category>

<body package="VWHelp" selector="odbDirty">odbDirty
	"If using GemStone, send markDirty.
	If using Versant, send vDirty
	#{GSSessionManager} isDefined
		ifTrue: [self markDirty].
	#{ODBInterface} isDefined
		ifTrue: [self vDirty]"</body>

<body package="VWHelp" selector="odbRefresh">odbRefresh
	"If in Versant, refresh self from the ODB using
	#{ODBInterface} isDefined
		ifTrue: [self refresh]."</body>

<body package="VWHelp" selector="odbRefreshIfNotDirty">odbRefreshIfNotDirty
	"If in Versant, refresh self from the ODB if self hasn't been changed locally.

	#{ODBInterface} isDefined
		ifTrue: [self proxy isDirty not
					ifTrue: [self odbRefresh]]."</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutlineViewerModel</class-id> <category>Help Core mods</category>

<body package="VWHelp" selector="expandIndex:in:fully:">expandIndex: anIndex in: aCollection fully: aBoolean

	"VWHelp Modification:
	If Outline at anIndex is a VWHelp object that needs to be parsed, 
	then invoke the method to build xmlOutline and replace in this Collection"
	| anEntry |
	self master textController textHasChanged ifTrue: [self master forceAccept].
	anEntry := (aCollection at:anIndex) value.
	(anEntry data isKindOf:VWHelp.OutlineEntry)
	ifTrue:
		[(aCollection at:anIndex) value:(self outline buildXmlOutlineFrom:anEntry)].
	^super expandIndex: anIndex in: aCollection fully: aBoolean</body>
</methods>

<methods>
<class-id>VWHelp.AHSWHCProcessor class</class-id> <category>class initialization</category>

<body package="VWHelp" selector="initialize">initialize
	"self initialize"

	TmpStorage := OrderedCollection new.
	AHSIcon := VisualLauncher helpIcon.	"modify this to switch the icon"
	HelpEnabledModel := AHSWHCWeakValueHolder with: true.
	HelpEnabledModel onChangeSend: #helpEnabledChanged to: self.
	BalloonHelpEnabledModel := AHSWHCWeakValueHolder with: false.
	BalloonHelpEnabledModel onChangeSend: #balloonHelpEnabledChanged to: self.
	WidgetHelpEnabledModel := AHSWHCWeakValueHolder with: true.
	WidgetHelpEnabledModel onChangeSend: #widgetHelpEnabledChanged to: self.
	RestrictBalloonToCondensedText := false.
	CachedBalloonText := #{Smalltalk.Text} value new.
	BalloonDisplayDelay := nil.
	BalloonKillDelay := nil.
	Balloon := nil</body>
</methods>

<methods>
<class-id>VWHelp.AHSIndentableComposedText</class-id> <category>private</category>

<body package="VWHelp" selector="baseIndentOffset">baseIndentOffset
	"Answer the number of pixels to indent for each indent level."

	^TextConstants at:#DefaultTab</body>
</methods>

<methods>
<class-id>UI.UISettings class</class-id> <category>Help Core mods</category>

<body package="VWHelp" selector="addAHSSectionTo:development:runtime:">addAHSSectionTo: aDictionary development: devSpecs runtime: runtimeSpecs
	"Add the Lens set of preferences and settings slices to the arguments."

	aDictionary
		at: #helpDirectoryEditing
			put: nil asValue;
		at: #helpDirectory
			put: self helpDirectoryValue;
		at: #helpDirectoryAccept
			put: [self helpDirectoryAccept];
		at: #helpDirectoryReset
			put: [self helpDirectoryReset].

	devSpecs
		addLast: 'Help'-&gt;#(#ahsSettingsSpec #helpDirectoryHelp)</body>
</methods>

<methods>
<class-id>UI.UISettings class</class-id> <category>accessing preferences</category>

<body package="VWHelp" selector="helpDirectoryAccept">helpDirectoryAccept
	"Attempt to accept the changes made to the help directory path. Answer true if 
	the path is OK, false otherwise."

	| edit dir booksFound |
	
	edit := self preferenceModelFor: #helpDirectoryEditing.
	edit value notNil
		ifTrue: 
			[edit value size = 0
				ifTrue: 
					[Dialog warn: 'Please fill in the name of the help directory.'.
					^false].
			dir := (SystemUtils makeFilenamePortable:edit value) asFilename.
			dir exists
				ifFalse: 
					[Dialog warn: 'Directory ''' , dir asString , ''' does not exist.'.
					^false].
			dir isDirectory
				ifFalse: 
					[Dialog warn: '"' , dir asString , '" is not a directory.'.
					^false].
			booksFound := #{VWHelp.HelpBrowser}  value defaultDir: dir asString.
			booksFound
				ifFalse: 
					[Dialog warn: 'Subdirectories under ''' , dir asString , ''' do not contain any ''.xml'' files.'.
					^false].
			edit value: nil].
	^true</body>

<body package="VWHelp" selector="helpDirectoryReset">helpDirectoryReset

	| edit |
	edit := self preferenceModelFor: #helpDirectoryEditing.
	#{VWHelp.HelpBrowser}  value changed: #directory.
	edit value: nil</body>

<body package="VWHelp" selector="helpDirectoryValue">helpDirectoryValue
	| dirVal edit |
	dirVal := PluggableAdaptor on: #{VWHelp.HelpBrowser} value.
	edit := self preferenceModelFor: #helpDirectoryEditing.
	dirVal
		getBlock: [:browserClass | edit value notNil
				ifTrue: [edit value]
				ifFalse: [browserClass defaultDir asString]]
		putBlock: [:browserClass :dn | edit value: dn]
		updateBlock: [:browserClass :aspect :param | aspect == #directory
				ifTrue: 
					[edit value: nil.
					true]
				ifFalse: [false]].
	^dirVal</body>
</methods>

<methods>
<class-id>UI.UISettings</class-id> <category>accessing</category>

<body package="VWHelp" selector="acceptHelpDirectory">acceptHelpDirectory
	"Attempt to accept the changes made to the help directory path. If the path is 
	OK, disable the Accept and Cancel buttons."

	self class helpDirectoryAccept ifTrue: [self undisturb]</body>
</methods>

<methods>
<class-id>UI.UISettings</class-id> <category>Help Core mods</category>

<body package="VWHelp" selector="ahsAccept">ahsAccept

	self class helpDirectoryAccept.
	(self ahsSubBuilder aspectAt: #ahsTrigger) value: true.</body>

<body package="VWHelp" selector="ahsReset">ahsReset

	self class helpDirectoryReset.
	(self ahsSubBuilder aspectAt: #ahsTrigger) value: false.</body>
</methods>

<methods>
<class-id>UI.UISettings</class-id> <category>help</category>

<body package="VWHelp" selector="helpDirectoryHelp">helpDirectoryHelp
	^'Help Options

The Online Help Directory field holds the path to the directory containing the VisualWorks Online Help files.'</body>
</methods>

<methods>
<class-id>VWHelp.AHSHyperGraphicLinkObject</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="initialize">initialize

	super initialize.
	self caption: 'Enter Caption Text Here' asText.
	self imageProportion: 0.75.		"Only used if isEmbedded is false"
	self windowExtent: nil.			"Only used if isEmbedded is false"
	self isEmbedded: true.
	self captionLocation: #center.	"Only used if isEmbedded is true"</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutlinerSubsetList</class-id> <category>actions</category>

<body package="VWHelp" selector="clearHistory">clearHistory

	| selection |
	(Dialog confirm: #'Are You Sure' &lt;&lt; self messageCatalogID)
		ifFalse: [^self].

	selection := self outliner outliner list selection.
	self outliner history clear.
	selection notNil
		ifTrue: [self outliner history
					add: selection value data;
					push: selection value data].
	self subsetList list: self outliner history linearHistory.
	self subsetList list isEmpty not
		ifTrue: [self subsetList selectionIndex: 1]</body>
</methods>

<methods>
<class-id>VWHelp.ArborOutlineBrowserModel</class-id> <category>Help Core mods</category>

<body package="VWHelp" selector="emphasisFor:">emphasisFor: anObject

	^#()</body>
</methods>

<methods>
<class-id>VWHelp.ArborHierarchicalSequenceView</class-id> <category>initialize-release</category>

<body package="VWHelp" selector="initializeVisuals">initializeVisuals
	"Default to using visual blocks for display.  This assumes the use of ArborLabeledObjectHolders for the list elements."
	self visualBlock:[:view :index |
		index = 0 
			ifTrue:[(view sequence at: index+1)
				asVisualComponentWhereSelected: false
				inTransition: view inTransition
				attributes: view textStyle]	
			ifFalse:[(view sequence at: index)
				asVisualComponentWhereSelected: false
				inTransition: view inTransition
				attributes: view textStyle]].
	self selectedVisualBlock: [:view :index || vc rw |
		vc := (view sequence at: index)
				asVisualComponentWhereSelected: true
				inTransition: view inTransition
				attributes: view textStyle.
		rw := ReversingWrapper on: vc component.
		rw reverse setValue: true.
		vc component: rw].</body>
</methods>

<methods>
<class-id>VWHelp.AHSStorageManager class</class-id> <category>AHSOHC adds-outlines</category>

<body package="VWHelp" selector="bookmarksInFlatFileNamed:">bookmarksInFlatFileNamed: aString
	"Answers nil if bookmarks not found or is not a AHSPersistentDictionary"
	| bookmarks aFilename aP |
	bookmarks := nil.
	Cursor wait showWhile: 
	[aFilename := self fullBookmarkFilename: aString.
	aFilename asFilename exists
	ifTrue:
		[ aP := Parcel loadParcelFrom:aFilename asFilename.
		 aP notNil
		ifTrue:
			[bookmarks := aP namedObjects at:#helpBookmarks ifAbsent:[nil].
			bookmarks notNil
			ifTrue:
				[(bookmarks isKindOf: AHSPersistentDictionary)
				ifFalse: [bookmarks := nil]].
			Parcel unloadParcelNamed:aP name].
		]].	
	^bookmarks</body>

<body package="VWHelp" selector="bookmarksInFlatFileNamed:put:">bookmarksInFlatFileNamed: aString put: bookmarks
	"Save bookmarks in a flat file."
	| aP |
	Cursor wait 
		showWhile: [| aFilename |
					aFilename := self fullBookmarkFilename: aString.
			aP := Parcel createParcelNamed:(aFilename copyUpTo:$.).
			aP isNil
			ifFalse:
				[aP addObject:bookmarks named:#helpBookmarks.
				aP parcelOutOn: aFilename withSource: nil hideOnLoad: true republish: false backup: false.
				Parcel unloadParcelNamed:aP name]].
	^true</body>
</methods>

<methods>
<class-id>Tools.VisualLauncher</class-id> <category>actions</category>

<body package="VWHelp" selector="helpLoadHelp">helpLoadHelp
	"This is an overriding extension that hides the Load Help mehu pragma version of this method."</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutline</class-id> <category>Help Core mods</category>

<body package="VWHelp" selector="buildXmlOutlineFrom:">buildXmlOutlineFrom:anEntry
	"If HelpBook contains an XMLDoc as a proxy then parse and build an
	HelpOutline from this XMLDoc. Once done set proxy to nil"
	
	| aBk oc graphAssoc |
	aBk := anEntry data proxy.
	aBk isNil
	ifFalse:[aBk buildOutline.
		    oc := aBk contents forest.
		    anEntry children:OrderedCollection new.
		    oc do:[:aTree | anEntry addChild:aTree].
		    graphAssoc := aBk contents graphicsDictionary associations.
			graphAssoc isEmpty ifFalse:
				[graphAssoc do:
					[:anAssoc |
		    		self graphicsDictionary add:anAssoc]].
			anEntry data outlineFile:aBk fileID asLogicalFileSpecification tail.
		    anEntry data proxy:nil].
	^anEntry</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutline</class-id> <category>searching</category>

<body package="VWHelp" selector="findLinkTopicNumber:">findLinkTopicNumber: aHyperLink
	"Find the topic in the outline that has the topic number topicNumber
	 and answer the Tree node, or nil if not found"
	"Modified to build the xmlOutline before searching for a topic. The test to
	see if the xmlOutline is already built is done in the #buildXmlOutlineFrom:
	method"
	| obj anEntry |
	obj := nil.
	self forest
		detect: 
			[:eachTree |
			anEntry := eachTree data.
			((anEntry isKindOf:VWHelp.OutlineEntry) and:[anEntry proxy notNil])
			ifTrue:[(aHyperLink outlineName = (anEntry proxy fileID asLogicalFileSpecification tail))
					ifTrue:[self buildXmlOutlineFrom:eachTree]].
			(aHyperLink outlineName = anEntry outlineFile)
			ifTrue:[ 
				obj := eachTree 
					detect: [:node |  node data uniqueID = aHyperLink topicName]
							ifNone: [nil]].
				obj notNil]
		ifNone: [].
	^obj</body>

<body package="VWHelp" selector="findTopicNumber:">findTopicNumber: topicNumber
	"Find the topic in the outline that has the topic number topicNumber
	 and answer the Tree node, or nil if not found"

	| obj |
	self forest
		detect: 
			[:eachTree |
			((eachTree data isKindOf:VWHelp.OutlineEntry) and:[eachTree data proxy notNil])
				 ifTrue:[self buildXmlOutlineFrom:eachTree].
			obj := eachTree
					detect: [:node | node data uniqueID = topicNumber]
					ifNone: [nil].
			obj notNil]
		ifNone: [].
	^obj</body>
</methods>

<methods>
<class-id>Core.CharacterArray</class-id> <category>utility</category>

<body package="VWHelp" selector="trimExteriorCRs">trimExteriorCRs

	| size index cr |
	(size := self size) == 0 ifTrue: [^self].
	index := 1.
	cr := Character cr.
	[(self at: index) = cr] whileTrue: [
		index = size ifTrue: [^''].
		index := index + 1].
	[(self at: size) = cr] whileTrue: [
		index = size ifTrue: [^''].
		size := size - 1].
	^self copyFrom: index to: size</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutlineViewer</class-id> <category>bookmarks</category>

<body package="VWHelp" selector="addBookmark">addBookmark
	"Add a bookmark to the bookmark dictionary for the current page.  The name of the bookmark 
	 defaults to the current topic.  The bookmark name must be unique."
	| aTree bookmark aMenuItem |
	(aTree := self outliner selectionValue) isNil ifTrue: [^ Dialog warn: 'No topic selected.'].
	(bookmark := self getNewBookmarkNameFromUser: aTree data topic) isNil ifTrue: [ ^ nil].
	self bookmarks 
		at: bookmark
		put: aTree data uniqueID.
	aMenuItem := MenuItem labeled: (bookmark copyReplaceAll: '&amp;' with: '&amp;&amp;').
	self bookmarkMenu numberOfItems == 2
		ifTrue: [self bookmarkMenu aisAddSeparator].
	self bookmarkMenu 
		addItem: aMenuItem 
		value: [self engageBookmark: bookmark] 
		nameKey: bookmark.</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutlineViewer</class-id> <category>menu construction - private</category>

<body package="VWHelp" selector="addBookmarkSubmenuTo:">addBookmarkSubmenuTo: aMenu
	"Private - Add the Bookmark submenu to aMenu."

	| bookmarkMenu |
	bookmarkMenu := Menu new.
	bookmarkMenu
		addItem: ((MenuItem labeled: #'Add Bookmark' &lt;&lt; self messageCatalogID)
						value: #addBookmark;
						shortcutKeyCharacter: $K;
						enabled: [self outliner list selectionIndex ~= 0]);
		addItem: ((MenuItem labeled: #'Delete Bookmark' &lt;&lt; self messageCatalogID)
						value: #deleteBookmark;
						enabled: [self bookmarks keys isEmpty not]);
		addItem: ((MenuItem labeled: #'Save Bookmarks' &lt;&lt; self messageCatalogID)
						value: #saveBookmarksInFile;
						shortcutKeyCharacter: $S).
	^aMenu addItem: ((MenuItem labeled: #Bookmark &lt;&lt; self messageCatalogID)
							nameKey: #bookmark;
							submenu: bookmarkMenu)</body>

<body package="VWHelp" selector="addFileSubmenuTo:">addFileSubmenuTo: aMenu
	"Private - Add the File submenu to aMenu."

	| sub assoc |
	sub := Menu new.
	(assoc := self getDBAssociationForOpen) notNil
		ifTrue: [sub addItemLabel: assoc key &lt;&lt; self messageCatalogID value: assoc value].

	self addExportItemsTo: sub.
	self addPrintSubmenuTo: sub.
	sub
		aisAddSeparator;
		addItem: ((MenuItem labeled: #Exit &lt;&lt; self messageCatalogID)
						value: #closeRequest).
	^aMenu addItem: ((MenuItem labeled: #File &lt;&lt; self messageCatalogID)
						nameKey: #file;
						submenu: sub)</body>

<body package="VWHelp" selector="addNavigateSubmenuTo:">addNavigateSubmenuTo: aMenu
	"Private - Add the 'navigate' components to aMenu."

	| navigateMenu |
	navigateMenu := Menu new.
	navigateMenu
		addItem: ((MenuItem labeled: #History &lt;&lt; self messageCatalogID)
						value: #openHistory;
						shortcutKeyCharacter: $H;
						enabled: [self history stack isEmpty not]);
		addItem: ((MenuItem labeled: #Back &lt;&lt; self messageCatalogID)
						value: #goBackwardsOnce;
						shortcutKeyCharacter: $B;
						enabled: [self history topOfStack &gt; 1]);
		addItem: ((MenuItem labeled: #Forward &lt;&lt; self messageCatalogID)
						value: #goForwardOnce;
						shortcutKeyCharacter: $F;
						enabled: [self history stack size ~= self history topOfStack]);
		aisAddSeparator;
		addItem: ((MenuItem labeled: #Search &lt;&lt; self messageCatalogID) value: #search);
		addItem: ((MenuItem labeled: #'Repeat Last Search' &lt;&lt; self messageCatalogID)
						value: #repeatLastSearch;
						shortcutKeyCharacter: $R;
						enabled: [self searchString notNil]).
	^aMenu addItem: ((MenuItem labeled: #Navigate &lt;&lt; self messageCatalogID)
							nameKey: #navigate;
							submenu: navigateMenu)</body>

<body package="VWHelp" selector="addPrintSubmenuTo:">addPrintSubmenuTo: aMenu
	"Private - Add the Print submenu to aMenu"

	^aMenu addItem: ((MenuItem labeled: #Print &lt;&lt; self messageCatalogID)
						submenu: (Menu new
										addItem: ((MenuItem labeled: #'Selected Topic' &lt;&lt; self messageCatalogID)
														value: #printTopic;
														shortcutKeyCharacter: $P);
										addItemLabel: #'All SubTopics' &lt;&lt; self messageCatalogID value: #printTopicTree))</body>

<body package="VWHelp" selector="addViewSubmenuTo:">addViewSubmenuTo: aMenu
	"Private - Add the View submenu to aMenu."

	| viewMenu |
	viewMenu := Menu new.
	viewMenu
		addItem: ((MenuItem labeled: #'Contract All' &lt;&lt; self messageCatalogID)
						value: #contractAll;
						shortcutKeyCharacter: $C);
		aisAddSeparator;
		addItem: ((MenuItem labeled: #Zoom &lt;&lt; self messageCatalogID)
						value: #zoom;
						nameKey: #zoom;
						shortcutKeyCharacter: $Z);
		aisAddSeparator;
		addItem: ((MenuItem labeled: #Graphics &lt;&lt; self messageCatalogID)
						value: #showGraphics;
						shortcutKeyCharacter: $G).
	^aMenu addItem: ((MenuItem labeled: #View &lt;&lt; self messageCatalogID)
						nameKey: #view;
						submenu: viewMenu)</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutlineViewer</class-id> <category>menu resources</category>

<body package="VWHelp" selector="constructedMenuBar">constructedMenuBar

	| menu |
	menu := Menu new.
	^self 
		addFileSubmenuTo: menu;
		addViewSubmenuTo: menu;
		addNavigateSubmenuTo: menu;
		addBookmarkSubmenuTo: menu.</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutlineViewer</class-id> <category>bookmarks</category>

<body package="VWHelp" selector="deleteBookmark">deleteBookmark
	"Delete a bookmark that is selected by the user in a list of bookmarks from the bookmark menu. "
	| bookmarkList bookmark |
	(bookmarkList := self bookmarks keys asList) isEmpty ifTrue: [^ Dialog warn: 'There are no bookmarks to delete.'].
	(bookmark := Dialog 
						choose: 'Bookmark to delete:' 
						fromList: bookmarkList 
						values: bookmarkList 
						lines: 10 
						cancel: [nil]) isNil ifTrue: [^ nil].
	self bookmarks removeKey: bookmark.
	self bookmarkMenu removeItem: (self bookmarkMenu atNameKey: bookmark)</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutlineViewer</class-id> <category>private</category>

<body package="VWHelp" selector="findBookmarkTopic:">findBookmarkTopic: aBookmark
	"Private - Answer the topic in the outline at the specified bookmark."
	Cursor wait showWhile:
	[^self outline findTopicNumber: (bookmarks at: aBookmark)]</body>

<body package="VWHelp" selector="jumpToTopicReferencedBy:">jumpToTopicReferencedBy: aHyperlink
	"Private - Jump to the topic referenced by aHyperlink."
	| topic |
	Cursor wait showWhile: 
		[(topic := self outline findLinkTopicNumber: aHyperlink) isNil 
		ifTrue: [^ Dialog warn: 'The linked topic could not be found']].
	self checkForAutoAccept.
	self outliner selectEntry: topic.
	self toolbarTextEditor deselect</body>

<body package="VWHelp" selector="openOutlineViewerFor:">openOutlineViewerFor: aHyperlink
	"Private - Open a new outline window for the item referenced in aHyperlink.  If the link 
	references an outline which is already open, reuse the one that is already open.  This 
	assumes that the outline is not the outline being viewed by the receiver."
	"VWHelp Modification: The link may reference a topic in an xmlOutline that hasn't
	been built yet. So build the xmlOutline first and then jump to the topic"

	| otherOutline |
	otherOutline := aHyperlink outlineName isNil
					ifTrue: [self outlineName]
					ifFalse: [aHyperlink outlineName].
	otherOutline asFilename extension = '.xml'
	ifTrue:
		[^self jumpToTopicReferencedBy: aHyperlink]
	ifFalse:[^ self class
			openOutlineNamed: otherOutline
			topicNumber: (aHyperlink topicName)
			modal: self builder window isModalDialog
			raiseExisting: self raiseExistingOutlineViewer.]</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutlineViewer</class-id> <category>searching</category>

<body package="VWHelp" selector="search">search
	"Get the search specifications from an AHSSearchDialog, and then perform the search."
	| searchDictionary shouldSearchTopics shouldSearchText |

	searchDictionary := AHSSearchDialog searchFor: ''.
	searchDictionary isNil 
		ifTrue: [^nil].

	self searchString: (searchDictionary at: #searchString) asString.
	shouldSearchTopics := searchDictionary at: #searchTopics ifAbsent: [false].
	shouldSearchText := searchDictionary at: #searchText ifAbsent: [false].

	self searchEntriesFound removeFrom: 1 to: self searchEntriesFound size.
	Cursor wait showWhile:	
	[self outline do:
		[:aTree |
		aTree do:
			[:currentTree || noMatch |
			noMatch := true.
			((currentTree data isKindOf:VWHelp.OutlineEntry) and:[currentTree data proxy notNil])
				 ifTrue:[self outline buildXmlOutlineFrom:currentTree].
			shouldSearchTopics ifTrue: 
				[(currentTree data topic asString asLowercase indexOfSubCollection: self searchString asLowercase startingAt: 1) ~= 0 ifTrue: 
					[self searchEntriesFound add: currentTree data.
					noMatch := false]].
			(shouldSearchText and: [noMatch])
				ifTrue: [(currentTree data text asString asLowercase indexOfSubCollection: self searchString asLowercase startingAt: 1) ~= 0
							ifTrue: [self searchEntriesFound add: currentTree data]]]]].

	self showSearchResults</body>
</methods>

<methods>
<class-id>VWHelp.AHSGlossaryViewer class</class-id> <category>interface specs</category>

<body package="VWHelp" selector="windowSpec">windowSpec
	"UIPainter new openOnClass: self andSelector: #windowSpec"

	&lt;resource: #canvas&gt;
	^#(#FullSpec 
		#window: 
		#(#WindowSpec 
			#label: 'Glossary Entry' 
			#min: #(#Point 413 181 ) 
			#max: #(#Point 640 480 ) 
			#bounds: #(#Rectangle 504 462 917 661 ) ) 
		#component: 
		#(#SpecCollection 
			#collection: #(
				#(#TextEditorSpec 
					#layout: #(#LayoutFrame 3 0 26 0 -3 1 -44 1 ) 
					#name: #text 
					#isOpaque: true 
					#model: #text 
					#isReadOnly: true ) 
				#(#InputFieldSpec 
					#layout: #(#LayoutFrame 2 0 2 0 -150 1 24 0 ) 
					#name: #selectedWord 
					#flags: 0 
					#model: #selectedWord 
					#isReadOnly: true 
					#type: #text ) 
				#(#ActionButtonSpec 
					#layout: #(#LayoutFrame -33 0.5 -37 1 47 0.5 -7 1 ) 
					#model: #closeRequest 
					#label: 
					#(#UserMessage 
						#key: #ok 
						#defaultString: 'ok' 
						#catalogID: #help ) 
					#isDefault: true 
					#defaultable: true ) ) ) )</body>
</methods>

<methods>
<class-id>UI.UISettings class</class-id> <category>interface specs</category>

<body package="VWHelp" selector="ahsSettingsSpec">ahsSettingsSpec
	"UIPainter new openOnClass: self andSelector: #ahsSettingsSpec"

	&lt;resource: #canvas&gt;
	^#(#{UI.FullSpec} 
		#window: 
		#(#{UI.WindowSpec} 
			#label: 'Unlabeled Canvas' 
			#bounds: #(#{Graphics.Rectangle} 393 326 695 627 ) ) 
		#component: 
		#(#{UI.SpecCollection} 
			#collection: #(
				#(#{UI.CompositeSpecCollection} 
					#collection: #(
						#(#{UI.SubCanvasSpec} 
							#layout: #(#{Graphics.LayoutFrame} 0 0.0132013 57 0 0 1.0 0 1.0 ) 
							#name: #ahsSettings 
							#flags: 9 
							#minorKey: #ahsDynamicallyGeneratedSpec ) 
						#(#{UI.SubCanvasSpec} 
							#layout: #(#{Graphics.LayoutFrame} 0 0.0 0 0.0 0 0.986799 0 0.206642 ) 
							#flags: 0 
							#minorKey: #helpDirectorySpec ) ) 
					#compositeSpec: 
					#(#{UI.CompositeSpec} 
						#layout: #(#{Graphics.LayoutFrame} 0 -0.00638978 0 -0.0124224 0 0.99361 0 0.885093 ) ) ) 
				#(#{UI.ActionButtonSpec} 
					#layout: #(#{Graphics.LayoutOrigin} 0 0.757188 0 0.909938 ) 
					#name: #helpButton 
					#model: #helpAction 
					#callbacksSpec: 
					#(#{UI.UIEventCallbackSubSpec} 
						#valueChangeSelector: #undisturb ) 
					#label: 'Help' 
					#style: #'Arbor-12-Squeeze' ) 
				#(#{UI.ActionButtonSpec} 
					#layout: #(#{Graphics.LayoutOrigin} 0 0.386581 0 0.909938 ) 
					#name: #resetButton 
					#flags: 40 
					#model: #ahsReset 
					#callbacksSpec: 
					#(#{UI.UIEventCallbackSubSpec} 
						#valueChangeSelector: #undisturb ) 
					#label: 'Reset' 
					#style: #'Arbor-12-Squeeze' ) 
				#(#{UI.ActionButtonSpec} 
					#layout: #(#{Graphics.LayoutOrigin} 0 0.0351438 0 0.909938 ) 
					#name: #acceptButton 
					#flags: 40 
					#model: #ahsAccept 
					#callbacksSpec: 
					#(#{UI.UIEventCallbackSubSpec} 
						#valueChangeSelector: #undisturb ) 
					#label: 'Accept' 
					#style: #'Arbor-12-Squeeze' ) ) ) )</body>

<body package="VWHelp" selector="helpDirectorySpec">helpDirectorySpec
	"UIPainter new openOnClass: self andSelector: #helpDirectorySpec"

	&lt;resource: #canvas&gt;
	^#(#{UI.FullSpec} 
		#window: 
		#(#{UI.WindowSpec} 
			#label: 'Unlabeled Canvas' 
			#min: #(#{Core.Point} 267 315 ) 
			#max: #(#{Core.Point} 267 315 ) 
			#bounds: #(#{Graphics.Rectangle} 522 494 789 809 ) ) 
		#component: 
		#(#{UI.SpecCollection} 
			#collection: #(
				#(#{UI.CompositeSpecCollection} 
					#collection: #(
						#(#{UI.LabelSpec} 
							#layout: #(#{UI.AlignmentOrigin} 0 0 18 0 0 1 ) 
							#label: 'Online Help Directory:' 
							#style: #'Arbor-12-Squeeze' ) 
						#(#{UI.InputFieldSpec} 
							#layout: #(#{UI.LayoutFrame} 0 0.0111111 19 0 0 1.0 41 0 ) 
							#model: #helpDirectory 
							#callbacksSpec: 
							#(#{UI.UIEventCallbackSubSpec} 
								#valueChangeSelector: #disturb ) 
							#menu: #fieldMenu ) ) 
					#compositeSpec: 
					#(#{UI.CompositeSpec} 
						#layout: #(#{UI.LayoutFrame} 0 0.00367647 0 0.125 0 0.996323 0 0.857143 ) ) ) ) ) )</body>
</methods>

<methods>
<class-id>VWHelp.AHSHyperGraphicViewer class</class-id> <category>interface specs</category>

<body package="VWHelp" selector="paneSubSpec">paneSubSpec
	"UIPainter new openOnClass: self andSelector: #paneSubSpec"

	&lt;resource: #canvas&gt;
	^#(#FullSpec 
		#window: 
		#(#WindowSpec 
			#label: 'Unlabeled Canvas' 
			#bounds: #(#Rectangle 520 220 1003 453 ) ) 
		#component: 
		#(#SpecCollection 
			#collection: #(
				#(#SequenceViewSpec 
					#layout: #(#LayoutFrame 4 0 30 0 0 0.438923 -4 1 ) 
					#name: #availableGraphics 
					#model: #availableGraphics 
					#menu: #listMenu ) 
				#(#ArbitraryComponentSpec 
					#layout: #(#LayoutFrame 0 0.451346 30 0 -3 1 -4 1 ) 
					#name: #graphic 
					#flags: 11 
					#component: #graphic ) 
				#(#LabelSpec 
					#layout: #(#AlignmentOrigin 218 0 30 0 0 1 ) 
					#label: 
					#(#UserMessage 
						#key: #graphic 
						#defaultString: 'graphic' 
						#catalogID: #help ) ) 
				#(#LabelSpec 
					#layout: #(#AlignmentOrigin 4 0 30 0 0 1 ) 
					#label: 
					#(#UserMessage 
						#key: #availableGraphics 
						#defaultString: 'availableGraphics' 
						#catalogID: #help ) ) ) ) )</body>

<body package="VWHelp" selector="windowSpec">windowSpec
	"UIPainter new openOnClass: self andSelector: #windowSpec"

	&lt;resource: #canvas&gt;
	^#(#FullSpec 
		#window: 
		#(#WindowSpec 
			#label: 'Graphics Browser' 
			#min: #(#Point 475 293 ) 
			#bounds: #(#Rectangle 694 173 1169 466 ) ) 
		#component: 
		#(#SpecCollection 
			#collection: #(
				#(#ActionButtonSpec 
					#layout: #(#LayoutFrame -104 1 -34 1 -2 1 -6 1 ) 
					#name: #ok 
					#model: #closeRequest 
					#label: 
					#(#UserMessage 
						#key: #ok 
						#defaultString: 'ok' 
						#catalogID: #help ) 
					#isDefault: true 
					#defaultable: true ) 
				#(#SubCanvasSpec 
					#layout: #(#LayoutFrame 0 0 0 0 0 1 -40 1 ) 
					#name: #listPanes 
					#flags: 0 
					#majorKey: #AHSHyperGraphicViewer 
					#minorKey: #paneSubSpec ) ) ) )</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutlinerSubsetList class</class-id> <category>interface specs</category>

<body package="VWHelp" selector="historyWindowSpec">historyWindowSpec
	"UIPainter new openOnClass: self andSelector: #historyWindowSpec"

	&lt;resource: #canvas&gt;
	^#(#FullSpec 
		#window: 
		#(#WindowSpec 
			#label: 'Outline Subset List' 
			#min: #(#Point 280 172 ) 
			#bounds: #(#Rectangle 359 192 639 364 ) ) 
		#component: 
		#(#SpecCollection 
			#collection: #(
				#(#SequenceViewSpec 
					#layout: #(#LayoutFrame 3 0 3 0 -3 1 -40 1 ) 
					#name: #subsetList 
					#model: #subsetList ) 
				#(#ActionButtonSpec 
					#layout: #(#LayoutFrame -71 1 -35 1 -3 1 -2 1 ) 
					#name: #close 
					#model: #closeRequest 
					#label: 
					#(#UserMessage 
						#key: #CloseButton 
						#defaultString: 'Close' 
						#catalogID: #help ) 
					#style: #'Arbor-12-Squeeze' 
					#isDefault: true 
					#defaultable: true ) 
				#(#ActionButtonSpec 
					#layout: #(#LayoutFrame 3 0 -35 1 112 0 -2 1 ) 
					#name: #clearHistory 
					#model: #clearHistory 
					#label: 
					#(#UserMessage 
						#key: #ClearHistory 
						#defaultString: 'Clear history' 
						#catalogID: #help ) 
					#style: #'Arbor-12-Squeeze' 
					#defaultable: true ) ) ) )</body>

<body package="VWHelp" selector="windowSpec">windowSpec
	"UIPainter new openOnClass: self andSelector: #windowSpec"

	&lt;resource: #canvas&gt;
	^#(#FullSpec 
		#window: 
		#(#WindowSpec 
			#label: 'Outline Subset List' 
			#min: #(#Point 280 172 ) 
			#bounds: #(#Rectangle 360 224 640 396 ) ) 
		#component: 
		#(#SpecCollection 
			#collection: #(
				#(#SequenceViewSpec 
					#layout: #(#LayoutFrame 0 0.0107143 0 0.0174419 0 0.989286 -38 1 ) 
					#name: #subsetList 
					#model: #subsetList ) 
				#(#ActionButtonSpec 
					#layout: #(#LayoutFrame -67 1 -33 1 0 0.996428 0 0.988372 ) 
					#name: #close 
					#model: #closeRequest 
					#label: 
					#(#UserMessage 
						#key: #CloseButton 
						#defaultString: 'Close' 
						#catalogID: #help ) 
					#style: #'Arbor-12-Squeeze' 
					#isDefault: true ) ) ) )</body>
</methods>

<methods>
<class-id>Tools.VisualLauncher</class-id> <category>actions</category>

<body package="VWHelp" selector="helpLauncher">helpLauncher

	&lt;menuItem: #(#_LauncherHelp #help '&amp;Launcher Help')
		nameKey: nil
		shortcutKeyCharacter: #F1
		shortcutModifiers: 0
		menu: #(#menuBar #help)
		position: 2.1&gt;

	SmalltalkWorkbench
		openHelpBook: 'VisualWorks Tools' 
		topic: 'Launcher'</body>

<body package="VWHelp" selector="helpOpenHelpBrowser">helpOpenHelpBrowser
	"Open the help browser."
	&lt;menuItem: #(#BrowseHelp #help 'Browse Help')
		icon: #helpIcon
		nameKey: nil
		menu: #(#launcherToolBar)
		position: 100.01
		helpText: #(#ShowOnlineHelp #labels 'Show online help')&gt;

	&lt;menuItem: #(#_Topics #help '&amp;Topics')
		icon: #helpIcon
		nameKey: nil
		menu: #(#menuBar #help)
		position: 2.2&gt;
	self openApplicationForClassNamed: #{VWHelp.HelpBrowser}</body>

<body package="VWHelp" selector="helpRebuildLibrary">helpRebuildLibrary

	"Open the help browser."
	&lt;menuItem: #(#_RebuildHelpLibrary #help '&amp;Rebuild Help Library')
		icon: nil
		nameKey: nil
		menu: #(#menuBar #help)
		position: 3.1&gt;
	
	#{VWHelp.HelpBrowser} value rebuildHelpLibrary</body>
</methods>

<methods>
<class-id>VWHelp.AHSOutlineViewer class</class-id> <category>interface specs</category>

<body package="VWHelp" selector="dialogSubSpec">dialogSubSpec
	"UIPainter new openOnClass: self andSelector: #dialogSubSpec"

	&lt;resource: #canvas&gt;
	^#(#FullSpec 
		#window: 
		#(#WindowSpec 
			#label: 'Help Outline' 
			#min: #(#Point 626 400 ) 
			#bounds: #(#Rectangle 399 503 1025 903 ) 
			#flags: 4 
			#menu: #outlinerWindowMenu ) 
		#component: 
		#(#SpecCollection 
			#collection: #(
				#(#SubCanvasSpec 
					#layout: #(#LayoutFrame 0 0 0 0 0 1 0 0.33 ) 
					#name: #listOutlineBrowser 
					#majorKey: #AHSOutlineViewerModel 
					#minorKey: #verticalScrollingSpec 
					#clientKey: #outliner ) 
				#(#ActionButtonSpec 
					#layout: #(#LayoutFrame -30 0.5 -26 1 30 0.5 -1 1 ) 
					#name: #close 
					#model: #accept 
					#label: 
					#(#UserMessage 
						#key: #CloseButton 
						#defaultString: 'Close' 
						#catalogID: #help ) 
					#defaultable: true ) 
				#(#SubCanvasSpec 
					#layout: #(#LayoutFrame 0 0 0 0.33 0 1 -30 1 ) 
					#name: #textSubCanvas 
					#majorKey: #AHSToolbarHypertextEditor 
					#minorKey: #subcanvasSpec 
					#clientKey: #toolbarTextEditor ) ) ) )</body>
</methods>

<initialize>
<class-id>VWHelp.Outline</class-id>
</initialize>

<initialize>
<class-id>VWHelp.Proxy</class-id>
</initialize>

<initialize>
<class-id>VWHelp.Bold</class-id>
</initialize>

<initialize>
<class-id>VWHelp.UILabel</class-id>
</initialize>

<initialize>
<class-id>Examples.ExamplesBrowser</class-id>
</initialize>

<initialize>
<class-id>VWHelp.HelpBrowser</class-id>
</initialize>

<initialize>
<class-id>VWHelp.PlatformElement</class-id>
</initialize>

<initialize>
<class-id>VWHelp.CodeSample</class-id>
</initialize>

<initialize>
<class-id>VWHelp.Library</class-id>
</initialize>

<initialize>
<class-id>VWHelp.AHSWHCProcessor</class-id>
</initialize>

<do-it>"Imported Classes:"</do-it>

<do-it>self error: 'Attempting to file-in parcel imports.  Choose terminate or close'</do-it>

<class>
<name>Object</name>
<environment>Core</environment>
<super></super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Kernel-Objects</category>
<attributes>
<package>Kernel-Objects</package>
</attributes>
</class>

<class>
<name>AHSHelpOutlineEntry</name>
<environment>VWHelp</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>topic text uniqueID </inst-vars>
<class-inst-vars>clipboard </class-inst-vars>
<imports></imports>
<category>Help-Outline Help-Core</category>
<attributes>
<package>Arbor Help System Outline Help Core</package>
</attributes>
</class>

<class>
<name>CharacterArray</name>
<environment>Core</environment>
<super>Core.ArrayedCollection</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Collections-Text</category>
<attributes>
<package>Collections-Text</package>
</attributes>
</class>

<class>
<name>NodeBuilder</name>
<environment>XML</environment>
<super>XML.XMLNodeBuilder</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>XML-Parsing</category>
<attributes>
<package>XML</package>
</attributes>
</class>

<class>
<name>AHSHelpHyperLinkObject</name>
<environment>VWHelp</environment>
<super>VWHelp.ArborHyperlink</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Outline Help-Core</category>
<attributes>
<package>Arbor Help System Outline Help Core</package>
</attributes>
</class>

<class>
<name>AHSHyperGraphicLinkObject</name>
<environment>VWHelp</environment>
<super>VWHelp.AHSHelpHyperLinkObject</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>caption imageProportion windowExtent captionLocation isEmbedded </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Outline Help-Core</category>
<attributes>
<package>Arbor Help System Outline Help Core</package>
</attributes>
</class>

<class>
<name>ArborOutlineBrowserModel</name>
<environment>VWHelp</environment>
<super>UI.ApplicationModel</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>getChildrenBlock getParentBlock hasChildrenBlock displayBlock openedSet menuHolder forest clipModel newEntryBlock moveBlock deleteBlock readOnly includeArrows </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Arbor Widget Extensions-Outline Browser</category>
<attributes>
<package>Arbor Help System Outline Help Core</package>
</attributes>
</class>

<class>
<name>UISettings</name>
<environment>UI</environment>
<super>UI.ApplicationModel</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>list disturbed subBuilder </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Interface-Support</category>
<attributes>
<package>Interface-Support</package>
</attributes>
</class>

<class>
<name>AHSOutline</name>
<environment>VWHelp</environment>
<super>Core.Object</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>name outlineLabel nextID fileFormat glossaryDictionary graphicsDictionary forest </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Outline Help-Core</category>
<attributes>
<package>Arbor Help System Outline Help Core</package>
</attributes>
</class>

<class>
<name>ArborHierarchicalSequenceView</name>
<environment>VWHelp</environment>
<super>UI.SequenceView</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>widthCache inTransition </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Arbor Widget Extensions-Outline Browser</category>
<attributes>
<package>Arbor Help System Outline Help Core</package>
</attributes>
</class>

<class>
<name>AHSOutlinerSubsetList</name>
<environment>VWHelp</environment>
<super>VWHelp.ArborSlaveApplicationModel</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>outliner subsetList windowLabel mode </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Outline Help-Core</category>
<attributes>
<package>Arbor Help System Outline Help Core</package>
</attributes>
</class>

<class>
<name>VisualLauncher</name>
<environment>Tools</environment>
<super>UI.ApplicationModel</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>menuBar toolBar textCollector toolDock </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Tools-Misc</category>
<attributes>
<package>Tools-Misc</package>
</attributes>
</class>

<class>
<name>Element</name>
<environment>XML</environment>
<super>XML.Node</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>tag attributes namespaces elements definition </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>XML-Nodes</category>
<attributes>
<package>XML</package>
</attributes>
</class>

<class>
<name>AHSOutlineViewerModel</name>
<environment>VWHelp</environment>
<super>VWHelp.ArborListOutlineBrowserModel</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>master </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Outline Help-Core</category>
<attributes>
<package>Arbor Help System Outline Help Core</package>
</attributes>
</class>

<class>
<name>ValueHolder</name>
<environment>UI</environment>
<super>UI.ValueModel</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>value </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Interface-Support</category>
<attributes>
<package>Interface-Support</package>
</attributes>
</class>

<class>
<name>AHSIndentableComposedText</name>
<environment>VWHelp</environment>
<super>Graphics.ComposedText</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars></inst-vars>
<class-inst-vars></class-inst-vars>
<imports>
			private Smalltalk.TextConstants.*
			</imports>
<category>Help-Outline Help-Core</category>
<attributes>
<package>Arbor Help System Outline Help Core</package>
</attributes>
</class>

<class>
<name>AHSOutlineViewer</name>
<environment>VWHelp</environment>
<super>UI.ApplicationModel</super>
<private>false</private>
<indexed-type>none</indexed-type>
<inst-vars>toolbarTextEditor outliner history infoHasChanged searchEntriesFound searchString outlinerWindowMenu historyIndex shouldUpdateHistoryStack zoomed bookmarks initialSelection outlineSource readOnly lastEntry </inst-vars>
<class-inst-vars></class-inst-vars>
<imports></imports>
<category>Help-Outline Help-Core</category>
<attributes>
<package>Arbor Help System Outline Help Core</package>
</attributes>
</class>

</st-source>
