🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by pieter Thu, 07 Aug 1986 12:01
Graphical FileList - a "Grapher" application
#318
Author: pieter
Date: Thu, 07 Aug 1986 12:01
323 lines
9370 bytes
The graphical FileList is an application of the "grapher" posted
earlier by Steve Messick. This application gives you a really nice
graphical overview of directories and sub-directories. You can
quickly select any file or directory and open a normal FileList.
This was built within a day and is really very simple.
It runs on a Tektronix 4406 with the Un*Flex O.S.
If you run Smalltalk version T2.2.0, you will be able to select
the font and size of your labels.
Bug-fixes for continuous horizontal scrolling are also included.

I haven't tried it on other machines/different environments, but
it is possible you will have to make minor changes to this code,
to suit your environment.

				Have fun, Pieter.

-----------------------------------------------------------------
|                          |>                                   |
| philabs!\                ||\       P.S. van der Meulen, MS 02 | 
| amdimage!\              /|| \   Philips Research Laboratories |
| --------- prls!pieter  / ||* \          Signetics Corporation |
| pyramid! /            /  ||   \           811 E.Arques Avenue |
| sigvme! /            /   ||    \     Sunnyvale, CA 94088-3409 |
|                     /____||_____\                             |
|                     \prls!pieter/                             |
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

-------------------------cut here--------------------------------
'If you file this in, the File List will have two new menu items
for selected directories in the selectionInList.
If you select -graphic spawn-, the grapher will be applied to
all files and directories under the selected directory.
In the Graphical File List you can select a File or Directory.
You can open a FileList again (the only yellowButtonMenu item).
If you select -overview-, only directories will appear in the now
labeled Graphical Directory List.
Some textStyle and delta-spacing facilities have been added.
The continuous horizontal scroll-bug has been fixed.

This program is placed in the public domain.
Neither I nor my department will recognize any responsibility for
damages arising from use of this program.

Philips Research Laboratories Sunnyvale, Pieter van der Meulen.'!



DisplayText subclass: #GraphNode
	instanceVariableNames: 'object from to fromPt toPt boxed '
	classVariableNames: 'LabelTextStyle'
	poolDictionaries: ''
	category: 'Grapher'!


!GraphNode class methodsFor: 'class initialization'!

initialize

	LabelTextStyle _ DefaultTextStyle copy

	"GraphNode initialize"! !



!GraphNode class methodsFor: 'accessing'!

setStyle

	| aSM aStyle | 
	aSM _ Smalltalk at: #StyleManager ifAbsent: [nil].
	aSM notNil
		ifTrue:
			[(aStyle _ aSM fromUser) notNil
				ifTrue:
					[self textStyle: aStyle asListStyle]].!

textStyle

	^LabelTextStyle!

textStyle: aStyle

	LabelTextStyle _ aStyle! !


!GraphNode methodsFor: 'private'!

from: fromNodes to: toNodes object: myObject label: label

	from _ fromNodes.
	to _ toNodes.
	object _ myObject.
	(label isKindOf: DisplayObject)
		ifTrue: [form _ label.
				offset _ 0@0]
		ifFalse: [self setText: label asText
				textStyle: LabelTextStyle copy
				offset: 0@0]! !




!GraphHolder methodsFor: 'accessing'!

delta
	^delta!



delta: aPoint

	delta _ aPoint max: 2@2! !




!GraphHolderView class methodsFor: 'private'!

createModel: roots children: childrenMsg label: labelMsg format: formatSymbols delta: aPoint

	| aGraph |
	aGraph _ GraphHolder createForestWithRoots: roots
					children: childrenMsg
					label: labelMsg.
	aGraph delta: aPoint.
	aGraph layout: formatSymbols.
	^aGraph! !




!GraphHolderView class methodsFor: 'instance creation'!

openOn: roots label: labelString format: formatSymbols menu: actionMenu childrenMsg: childrenMsg labelMsg: labelMsg delta: aPoint

	self open: (self createModel: roots
					children: childrenMsg
					label: labelMsg
					format: formatSymbols
					delta: aPoint)
		label: labelString
		menu: actionMenu! !





!FileStream methodsFor: 'grapher accessing'!

allChildren
	"If I am a directory, I have children."

	| files aDir | 
	files _ SortedCollection sortBlock: [:x :y | x name <= y name]. 
	self status isDirectory
		ifTrue:
			[aDir _ FileDirectory directoryNamed: self fullName.
			aDir namesDo: [:aName |
				files add: (FileStream fileNamed: aDir fullName,aName)]].
	^files!

children
	"My children are files and directories."

	^self allChildren!

dirChildren
	"My children are directories."

	| directories aDir subDir | 
	directories _ SortedCollection sortBlock: [:x :y | x name <= y name]. 
	self status isDirectory
		ifTrue:
			[aDir _ FileDirectory directoryNamed: self fullName.
			aDir namesDo: [:aName |
					(subDir _ FileStream fileNamed: aDir fullName,aName) isDirectory
						ifTrue:
							[directories add: subDir]]].
	^directories!

fileList
	"Open a file list on me."

	self status isDirectory
		ifTrue:
			[FileList openOnDirectory:
				(FileDirectory directoryNamed: self fullName)]
		ifFalse:
			[FileList openOnFileNames: (SortedCollection with: self fullName) label: 'File List']!

graphLabel

	^name asText!


graphicalFileList
	"Open a file list on me, if I am a directory."

	self status isDirectory
		ifTrue:
			[GraphNode setStyle.
			GraphHolderView
				openOn: (Array with: (Disk directoryNamed: self fullName))
				label: 'Graphical Directory List'
 				format: #( #horizontal )
				menu: (ActionMenu
					labels: 'File List' withCRs
					lines: #()
					selectors: #(fileList))
				childrenMsg: #children
				labelMsg: #graphLabel
				delta: 50@10]! !



!FileList methodsFor: 'directory list'!

graphicalBrowseDirectoriesOnly
	"Open a graphical FileList on the selected item if it is a directory."

	isReading _ false.
	GraphNode setStyle.
	GraphHolderView
		openOn: (Array with: (Disk directoryNamed: self fileName))
		label: 'Graphical Directory List'
 		format: #( #horizontal )
		menu: (ActionMenu
			labels: 'Spawn File List\Graphical Spawn' withCRs
			lines: #(1)
			selectors: #(fileList graphicalFileList))
		childrenMsg: #dirChildren
		labelMsg: #graphLabel
		delta: 50@10!



graphicalBrowseDirectory
	"Open a graphical FileList on the selected item if it is a directory."

	isReading _ false.
	GraphNode setStyle.
	GraphHolderView
		openOn: (Array with: (Disk directoryNamed: self fileName))
		label: 'Graphical File List'
 		format: #( #horizontal )
		menu: (ActionMenu
			labels: 'File List' withCRs
			lines: #()
			selectors: #(fileList))
		childrenMsg: #children
		labelMsg: #graphLabel
		delta: 30@10! !




!FileList class methodsFor: 'class initialization'!

initialize
	"FileList initialize"

	DirectoryMenu _ ActionMenu
				labels: 'list contents\spawn\graphic spawn\overview\copy name\rename\remove' withCRs
				lines: #(2 4 6)
				selectors: #(listDirectoryContents browseDirectory graphicalBrowseDirectory graphicalBrowseDirectoriesOnly  copyName renameFile deleteFile).
	NewFileMenu _ ActionMenu
				labels: 'copy name\rename\new file\new directory' withCRs
				lines: #(2 4 5)
				selectors: #(copyName renameFile createFile createDirectory).
	FileMenu _ ActionMenu
				labels: 'get contents\file in\copy name\rename\remove' withCRs
				lines: #(2 4)
				selectors: #(getFile fileInFile copyName renameFile deleteFile).! !



!XAxisScrollController methodsFor: 'private'!

scrollLeft
	"This is modified from the original to provide continuous scrolling"
	self changeCursor: Cursor left.
	[sensor anyButtonPressed]
		whileTrue:
			[self canXScroll
					ifTrue: 
						[self scrollViewLeft.
						self moveXMarker]].
	sensor waitNoButton!



scrollRight
	"This is modified from the original to provide continuous scrolling"
	self changeCursor: Cursor right.
	[sensor anyButtonPressed]
		whileTrue:
			[self canXScroll
					ifTrue: 
						[self scrollViewRight.
						self moveXMarker]].
	sensor waitNoButton!



xScrollAbsolute
	| oldMarker |
	self changeCursor: Cursor xMarker.
	self canXScroll & sensor anyButtonPressed ifTrue:
		[[sensor anyButtonPressed] whileTrue:
			[oldMarker _ xMarker.
			xMarker _ xMarker translateBy:
				((sensor cursorPoint x - xMarker center x min:
					xScrollBar inside right - xMarker right) max: xScrollBar inside left - xMarker left) @ 0.
			(oldMarker areasOutside: xMarker), (xMarker areasOutside: oldMarker) do:
				[:region | Display fill: region rule: Form reverse mask: Form gray].
			self xScrollView].
		xScrollBar display.
		self moveXMarker]! !


GraphNode initialize.
FileList initialize.
FileList flushMenus
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads