gui/PPBrowserStream.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 16 Jun 2015 07:49:21 +0100
changeset 491 82b272c7dc37
parent 328 2562070b22a5
permissions -rw-r--r--
Codegen: added support for smart action node compiling. Avoid creation of intermediate result collection for action nodes if all references to action block's argument (i.e., the nodes collection) is in form of: * <nodes> at: <numeric constant> * <nodes> first (second, third...

"{ 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 $'
! !