<!doctype html public "-//W3C//DTD W3 HTML//EN">
<html><head><style type="text/css"><!--
blockquote, dl, ul, ol, li { padding-top: 0 ; padding-bottom: 0 }
--></style><title>Problem w/ GraphMorph::drawOn</title></head><body>
<div>I think I've found a small problem with the arrangement of
drawing methods in GraphMorph, which I stumbled upon when subclassing
GraphMorph.<br>
<br>
I wanted to override the way in which the shape of the underlying
function is defined. That was easy. Now, to the display
portion.<br>
<br>
Looking at the code, it seemed most appropriate to me to override
drawDataOn: in my derived class. Now, GraphMorph::drawOn: calls
"super drawOn:". If my overriding method
implementation calls "super drawOn:" (necessary in order to
get the border drawn), an infinite recursion ensues.<br>
<br>
Pictorially (excuse the ASCII line art):<br>
<br>
<font face="Courier New"> ---------------------------<br>
| RectangleMorph::drawOn: |
<-----------------------------------------<br>
--------------------------- <span
></span
> <span
></span
> <span
></span
>
|<br>
<span
></span
> <span
></span
> <span
></span
> <span
></span
> <span
></span
> <span
></span> |<br>
----------------------- <span
></span>
--------------------------- |<br>
| GraphMorph::drawOn: | isGraphMorph? |
GraphMorph::drawDataOn: | |<br>
| self drawDataOn: |- - - - - - - ->
| super drawOn:
|---<br>
-----------------------
\ <span
></span> ---------------------------<br>
<span
></span>
^ \
no<br>
<x-tab> </x-tab>
|
\<br>
<span
></span>
|----------------------------------------------------<br>
<span
></span
> <span
></span>
\ -------------------------
|<br>
<span
></span
> <span
></span>
\ | MyMorph::drawDataOn: |
|<br>
<span
></span
> <span
></span> ---->
| super drawOn:
|----<br>
<span
></span
> <span
></span
> <span
></span> -------------------------<br>
<br>
<br>
</font>It seems the fix is to move the call to "super drawOn:"
from GraphMorph::drawDataOn: to GraphMorph::drawOn:, as in the fileIn
below.<br>
<br>
Comments?<br>
<br>
============================================================<br>
!GraphMorph methodsFor: 'drawing' stamp: 'RMF 8/25/1999 18:02'!<br>
drawOn: aCanvas<br>
<x-tab> </x-tab>| c |<br>
<x-tab> </x-tab>super drawOn: aCanvas.<br>
<x-tab> </x-tab>cachedForm = nil<br>
<x-tab>
</x-tab><x-tab>
</x-tab>ifTrue:<br>
<x-tab> </x-tab><x-tab>
</x-tab><x-tab> </x-tab>[c _
FormCanvas extent: bounds extent.<br>
<x-tab> </x-tab><x-tab>
</x-tab><x-tab> </x-tab>c
translateBy: bounds origin negated during: [:tempCanvas | self
drawDataOn: tempCanvas].<br>
<x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab>cachedForm _ c form].<br>
<x-tab> </x-tab>aCanvas<br>
<x-tab> </x-tab><x-tab>
</x-tab>cache: bounds<br>
<x-tab>
</x-tab><x-tab>
</x-tab>using: cachedForm<br>
<x-tab>
</x-tab><x-tab>
</x-tab>during: [:cachingCanvas | self drawDataOn: cachingCanvas].<br>
<x-tab> </x-tab>self drawCursorOn:
aCanvas! !<br>
<br>
!GraphMorph methodsFor: 'private' stamp: 'RMF 8/25/1999 18:02'!<br>
drawDataOn: aCanvas<br>
<x-tab> </x-tab>| yScale baseLine x start end value left top bottom
right |<br>
<x-tab> </x-tab>data isEmpty ifTrue: [^
self].<br>
<x-tab> </x-tab>maxVal = minVal<br>
<x-tab> </x-tab><x-tab>
</x-tab>ifTrue: [yScale _ 1]<br>
<x-tab>
</x-tab><x-tab>
</x-tab>ifFalse: [yScale _ (bounds height - (2 * borderWidth)) asFloat
/ (maxVal - minVal)].<br>
<x-tab> </x-tab>baseLine _ bounds bottom -
borderWidth + (minVal * yScale) truncated.<br>
<x-tab> </x-tab>left _ top _ 0.<br>
<x-tab> </x-tab>right _ 10.<br>
<x-tab> </x-tab>bottom _ 0.<br>
<x-tab> </x-tab>x _ bounds left +
borderWidth.<br>
<x-tab> </x-tab>start _ (startIndex asInteger max: 1)<br>
<x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab><x-tab> </x-tab>min:
data size.<br>
<x-tab> </x-tab>end _ start + bounds width min: data size.<br>
<x-tab> </x-tab>start to: end do:<br>
<x-tab>
</x-tab><x-tab> </x-tab>[:i
|<br>
<x-tab>
</x-tab><x-tab> </x-tab>left
_ x truncated.<br>
<x-tab>
</x-tab><x-tab>
</x-tab>right _ x + 1.<br>
<x-tab> </x-tab><x-tab>
</x-tab>right > (bounds right - borderWidth) ifTrue: [^ self].<br>
<x-tab> </x-tab><x-tab>
</x-tab>value _ (data at: i) asFloat.<br>
<x-tab>
</x-tab><x-tab>
</x-tab>value >= 0.0<br>
<x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab>ifTrue:<br>
<x-tab> </x-tab><x-tab>
</x-tab><x-tab>
</x-tab><x-tab> </x-tab>[top
_ baseLine - (yScale * value) truncated.<br>
<x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab>bottom _ baseLine]<br>
<x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab>ifFalse:<br>
<x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab><x-tab> </x-tab>[top
_ baseLine.<br>
<x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab>bottom _ baseLine - (yScale * value) truncated].<br>
<x-tab>
</x-tab><x-tab>
</x-tab>aCanvas fillRectangle: (left @ top corner: right @ bottom)<br>
<x-tab>
</x-tab><x-tab>
</x-tab><x-tab>
</x-tab>color: dataColor.<br>
<x-tab>
</x-tab><x-tab> </x-tab>x _
x + 1]! !<br>
<br>
<br>
--------------------------------<br>
Robert M.
Fuhrer <span
></span
> <span
></span
> <span
></span> 34-231 (914)
945-3830<br>
IBM T. J. Watson Research
Center <span
></span
>
rfuhrer@watson.ibm.com<br>
Yorktown Heights, NY
10598 <span
></span> PGP Public Key available on
request</div>
</body>
</html>