initial checkin
authorClaus Gittinger <cg@exept.de>
Tue, 04 Mar 2014 22:14:15 +0100
changeset 328 2562070b22a5
parent 327 6f40d57a93c4
child 329 a5bd27e8e4c1
initial checkin
gui/PPBrowserStream.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gui/PPBrowserStream.st	Tue Mar 04 22:14:15 2014 +0100
@@ -0,0 +1,161 @@
+"{ Package: 'stx:goodies/petitparser/gui' }"
+
+PPStream subclass:#PPBrowserStream
+	instanceVariableNames:'positions stamps parsers'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'PetitGui-Core'
+!
+
+
+!PPBrowserStream methodsFor:'accessing'!
+
+next
+	| result |
+	result := super next.
+	self step.
+	^ result
+!
+
+next: aNumber
+	| result |
+	result := super next: aNumber.
+	self step.
+	^ result
+! !
+
+!PPBrowserStream methodsFor:'converting'!
+
+asExecutionTrace
+	| trace |
+	trace := OrderedCollection new: parsers size.
+	1 to: parsers size do: [ :index |
+		| parser |
+		parser := parsers at: index.
+		parser name isNil ifFalse: [
+			| start stop |
+			start := positions at: index.
+			stop := positions at: index + 1 ifAbsent: [ self size ].
+			trace addLast: (Array with: parser with: start with: stop) ] ].
+	^ trace
+!
+
+asFrequencyTable
+	| bag total result |
+	bag := parsers asBag.
+	total := 100.0 / bag size.
+	result := OrderedCollection new.
+	bag sortedCounts 
+		do: [ :each | result addLast: (Array with: each value with: each key with: total * each key) ].
+	^ result
+!
+
+asPositionDrawing
+	| stream source last |
+	stream := WriteStream on: String new.
+	source := self contents readStream.
+	last := 0.
+	[ source atEnd ] whileFalse: [
+		[ source atEnd not and: [ source peek isSeparator ] ]
+			whileTrue: [ source next ].
+		stream nextPutAll: '\fill [source] ('; print: source position / 100.0; nextPutAll: ', 0) rectangle ('.
+		[ source atEnd not and: [ source peek isSeparator not ] ]
+			whileTrue: [ source next ].
+		stream print: source position / 100.0; nextPutAll: ', '; print: self positions size / 100.0; nextPutAll: ');'; cr ].
+	stream nextPutAll: '\draw [parser] (0, 0)'.
+	1 to: self positions size do: [ :index |
+		last <= (self positions at: index)
+			ifTrue: [ stream nextPutAll: ' --' ].
+		last := self positions at: index.
+		stream nextPutAll: ' ('; print: last / 100.0; nextPutAll: ', '; print: index / 100.0; nextPut: $) ].
+	stream nextPut: $;.
+	^ stream contents
+!
+
+asPositionMorph
+	| width height canvas morph |
+	width := self size + 1 min: 2048.
+	height := self positions size min: 2048.
+	canvas := FormCanvas extent: width @ height.
+	self contents keysAndValuesDo: [ :index :char |
+		char isSeparator 
+			ifFalse: [ canvas line: index @ 1 to: index @ height color: Color paleBlue ] ].
+	1 to: height do: [ :index |
+		canvas form colorAt: (self positions at: index) @ index put: Color black ].
+	morph := canvas form asMorph.
+	morph 
+		on: #mouseDown
+		send: #mouseDown:with:
+		to: self.
+	^ morph
+!
+
+asTimingTable
+	| bag total result |
+	bag := Bag new.
+	1 to: stamps size - 1 do: [ :index |
+		bag
+			add: (parsers at: index) 
+			withOccurrences: (stamps at: index + 1) - (stamps at: index) ].
+	total := stamps last - stamps first.
+	result := OrderedCollection new.
+	bag sortedCounts
+		do: [ :each | result addLast: (Array with: each value with: each key with: total * each key) ].
+	^ result
+! !
+
+!PPBrowserStream methodsFor:'information'!
+
+parsers
+	^ parsers
+!
+
+positions
+	^ positions
+!
+
+stamps
+	^ stamps
+! !
+
+!PPBrowserStream methodsFor:'positioning'!
+
+position: aNumber
+	super position: aNumber.
+	self step
+!
+
+reset
+	super reset.
+	positions := OrderedCollection new: 1024.
+	stamps := OrderedCollection new: 1024.
+	parsers := OrderedCollection new: 1024
+! !
+
+!PPBrowserStream methodsFor:'private'!
+
+mouseDown: anEvent with: aMorph
+	| location string parser |
+	location := anEvent position.
+	string := collection 
+		copyFrom: (location x - 5 min: collection size max: 1) asInteger
+		to: (location x + 5 min: collection size max: 1) asInteger.
+	parser := parsers at: location y
+!
+
+step
+	positions addLast: position.
+	stamps addLast: Time millisecondClockValue.
+	parsers addLast: thisContext sender sender receiver
+! !
+
+!PPBrowserStream class methodsFor:'documentation'!
+
+version
+    ^ '$Header: /cvs/stx/stx/goodies/petitparser/gui/PPBrowserStream.st,v 1.1 2014-03-04 21:14:15 cg Exp $'
+!
+
+version_CVS
+    ^ '$Header: /cvs/stx/stx/goodies/petitparser/gui/PPBrowserStream.st,v 1.1 2014-03-04 21:14:15 cg Exp $'
+! !
+