Pharo-dev
By thread
pharo-dev@lists.pharo.org
By month
Messages by month
- ----- 2026 -----
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
August 2011
- 104 participants
- 1359 messages
Re: [Pharo-project] Some bugs
by Nicolas Cellier
So the entries of interest for highlighting are
Debugger>>contentsSelection
Debugger>>pcRange
CompiledMethod>>debuggerMap
DebuggerMethodMap class>>forMethod:
DebuggerMethodMap>>rangeForPC:contextIsActiveContext:
Then you see the DebuggerMethodMap>>forMethod:methodNode: takes both a
CompiledMethod and its #methodNode.
CompiledMethod>>methodNode invokes the Parser to get the
AbstractSyntaxTree from method source, and if it ever fails ends up by
trying to decompile the byteCodes.
This is the easy part. Now we to deal with #abstractPCForConcretePC:
and #abstractSourceMap.
By reading CompiledMethod>>abstractPCForConcretePC: you should quickly
understand that a concrete PC is a byte offset of current byteCode
(the offsets displayed in the byteCode view) while the abstractPC is
just the rank of current byteCode in the list of byteCodes
instructions composing the CompiledMethod. This is just because
"byteCodes" may spread on several bytes beside their name...
This will use InstructionStream and InstructionClient which are just
an iterator and a sort of visitor on byteCode instructions.
So this is not really interesting.
The more interesting part is #abstractSourceMap
There is a first step to obtain CompiledMethod>>rawSourceRangesAndMethodDo:
This is the most important part.
The rest is again a mapping from concretePC (instruction byte offset)
to abstractPC (instruction rank).
And some build of a dictionary mapping instruction rank (abstractPC)
-> selected range.
Note that the last trick seems to use a regenerated CompiledMethod
(theMethodToScan) rather than the original CompiledMethod. There is no
assertion whether these two are equivalent or not. A priori, they
should, unless the Compiler changed since last compilation or if its
behaviour is affected by some Preferences... Would we introduce some
customizable Compiler optimizations that this could become a problem
(We would then add to map decompiled AST to source code AST, probably
with guesses, unless the CompiledMethod would contain debugger
friendly hints...)
We will consider this is not a problem by now.
So let's now concentrate on rawSourceRangesAndMethodDo:
The nice thing is that you now can just debug this
(ClosureTests>>#testToDoOutsideTemp) methodNode
rawSourceRangesAndMethodDo: [:rs :mth | ]
and see how it goes in Squeak. I did not look in Pharo yet, but I
would be amazed to see it much different.
It's now late, and my spare time is off, but you have clues to get
more insights. I wish you good debugging, and come back to me if it
ever goes in deeper complications.
Cheers
Nicolas
2011/8/24 Michael Roberts <mike(a)mjr104.co.uk>:
>
>>
>> Ok I'm curious to know then.
>
> Here is a little trace from this example method:
>
> toDoOutsideTemp
> | temp collection |
> collection := OrderedCollection new.
> 1 to: 5 do: [ :index |
> temp := index.
> collection add: [ temp ] ]
>
> Trace is start,stop position of the highlight for each 'step over'.
>
> Whilst the numbers are hard to visualise, below you can see how they
> slightly diverge.
> Left Pharo  Right  Squeak
>
> 50, 73 Â Â 71, 73 Â Â Â diff
> 71, 73 Â Â 71, 73
> 50, 73 Â Â 50, 73
> 108, 115 Â 79, 121 Â Â Â diff
> 79, 121 Â Â 79, 121
> 108, 115 Â 108, 115
> 132, 144 Â 132, 144
> 147, 146 Â 146, 146 Â Â (diff negative size means no highlight)
> 146, 146 Â 146, 146
> 79, 121 Â Â 79, 121
> 108, 115 Â 108, 115
> 132, 144 Â 132, 144
> 147, 146 Â 146, 146
> 146, 146 Â 146, 146
> 79, 121 Â Â 79, 121
> 108, 115 Â 108, 115
> 132, 144 Â 132, 144
> 147, 146 Â 146, 146
> 146, 146 Â 146, 146
> 79, 121 Â Â 79, 121
> 108, 115 Â 108, 115
> etc...
> For example the first difference is because Pharo shows the whole assignment
> of the first line as the first send, even though it is not.
> The second difference is that Pharo shows the assignment inside the block as
> the first highlight of the loop even though the to:do should be
> highlighted....but both Pharo & Squeak get the to:do: wrong when they choose
> to show it.
> hope you get the idea...
> Mike
Aug. 24, 2011
Re: [Pharo-project] [ANN] OpenDBXDriver Release - DBXTalk Release Step 1
by Stéphane Ducasse
Excellent!
Stef
On Aug 24, 2011, at 1:19 PM, Guillermo Polito wrote:
> Hi folks!!
>
> We are proud to make our first release of OpenDBXDriver -1.0 version-, formerly known as SqueakDBX. Now the project involves much more than just a database driver. This whole new project is called DBXTalk and OpenDBXDriver is just one of the sub-projects.
>
> There are several changes between this version and the last one of SqueakDBX, but most of them is about infrastructure: test were moved to a separate package, platform packages and backend classes were renamed, all "SqueakDBX" was replaced with its new name.
>
> To install it:
>
> Gofer it
> squeaksource: 'MetacelloRepository';
> package: 'ConfigurationOfOpenDBXDriver';
> load.
>
> (((Smalltalk globals at: #ConfigurationOfOpenDBXDriver) perform: #project) perform: #version: with: #stable) load.
>
>
> We have also created a new repository for all the code: http://www.squeaksource.com/DBXTalk
>
> The issue tracker is in: http://code.google.com/p/dbxtalk/issues/list
>
> Thanks to Natacha Perrin we have a new DBXTalk logo that you can see in: http://imageshack.us/photo/my-images/37/dbxtalk46.png
> The license of the logo is Creative Commons.
>
> We have also started a Pharo By Example chapter. So far we are writing about DBXTalk, but soon we will do about Glorp. We attach a draft of it while it is integrated into the main git repository of the book.
> Just in case here is the git repo fork: https://github.com/guillep/PharoByExample-english.
>
> Just to let you know, we have already ported the last VW release of Glorp to Pharo and we have it already working MySQL, PostgreSQL, Oracle and Sqlite3. We are closing some last problems and we will soon make the first release. We want to thanks Alan Night for all his help and his reviews :).
>
> 4 persons of the team are present at ESUG right now and we are going to give a talk on Friday. We will upload then the slides.
>
> Finally, we would like to thanks ESUG for the sponsorship through this ESUG SummerTalk.
>
> Thanks!
> Guille, Mariano, Esteban, Santiago, Gise
> <dbxtalk_logo.png><DBXTalk.tex>
Aug. 24, 2011
Re: [Pharo-project] Some bugs
by Michael Roberts
>
> Ok I'm curious to know then.
Here is a little trace from this example method:
toDoOutsideTemp
| temp collection |
collection := OrderedCollection new.
1 to: 5 do: [ :index |
temp := index.
collection add: [ temp ] ]
Trace is start,stop position of the highlight for each 'step over'.
Whilst the numbers are hard to visualise, below you can see how they
slightly diverge.
Left Pharo Right Squeak
50, 73 71, 73 diff
71, 73 71, 73
50, 73 50, 73
108, 115 79, 121 diff
79, 121 79, 121
108, 115 108, 115
132, 144 132, 144
147, 146 146, 146 (diff negative size means no highlight)
146, 146 146, 146
79, 121 79, 121
108, 115 108, 115
132, 144 132, 144
147, 146 146, 146
146, 146 146, 146
79, 121 79, 121
108, 115 108, 115
132, 144 132, 144
147, 146 146, 146
146, 146 146, 146
79, 121 79, 121
108, 115 108, 115
etc...
For example the first difference is because Pharo shows the whole assignment
of the first line as the first send, even though it is not.
The second difference is that Pharo shows the assignment inside the block as
the first highlight of the loop even though the to:do should be
highlighted....but both Pharo & Squeak get the to:do: wrong when they choose
to show it.
hope you get the idea...
Mike
Aug. 24, 2011
[Pharo-project] [ANN] OpenDBXDriver Release - DBXTalk Release Step 1
by Guillermo Polito
Hi folks!!
We are proud to make our first release of OpenDBXDriver -1.0 version-,
formerly known as SqueakDBX. Now the project involves much more than just a
database driver. This whole new project is called DBXTalk and OpenDBXDriver
is just one of the sub-projects.
There are several changes between this version and the last one of
SqueakDBX, but most of them is about infrastructure: test were moved to a
separate package, platform packages and backend classes were renamed, all
"SqueakDBX" was replaced with its new name.
To install it:
Gofer it
squeaksource: 'MetacelloRepository';
package: 'ConfigurationOfOpenDBXDriver';
load.
(((Smalltalk globals at: #ConfigurationOfOpenDBXDriver) perform: #project)
perform: #version: with: #stable) load.
We have also created a new repository for all the code:
http://www.squeaksource.com/DBXTalk
The issue tracker is in: http://code.google.com/p/dbxtalk/issues/list
Thanks to Natacha Perrin we have a new DBXTalk logo that you can see in:
http://imageshack.us/photo/my-images/37/dbxtalk46.png
The license of the logo is Creative Commons.
We have also started a Pharo By Example chapter. So far we are writing
about DBXTalk, but soon we will do about Glorp. We attach a draft of it
while it is integrated into the main git repository of the book.
Just in case here is the git repo fork:
https://github.com/guillep/PharoByExample-english.
Just to let you know, we have already ported the last VW release of Glorp to
Pharo and we have it already working MySQL, PostgreSQL, Oracle and Sqlite3.
We are closing some last problems and we will soon make the first release.
We want to thanks Alan Night for all his help and his reviews :).
4 persons of the team are present at ESUG right now and we are going to give
a talk on Friday. We will upload then the slides.
Finally, we would like to thanks ESUG for the sponsorship through this ESUG
SummerTalk.
Thanks!
Guille, Mariano, Esteban, Santiago, Gise
Aug. 24, 2011
Re: [Pharo-project] Using system fonts in Pharo
by Ilmari Vacklin
Thank you Camillo. I was running a Cog VM from http://www.mirandabanda.org/files/Cog/VM/VM.r2489/. Downloading one from your link worked.
--
Ilmari Vacklin
On keskiviikko 24. elokuuta 2011 at 12.19, Camillo Bruni wrote:
> that should load all the fonts which are installed on your system and make them avail in the font dialogs :). But you have to make sure that the Freetype Plugin is installed (the easiest way is to download one of the latest VMs from jenkins: https://ci.lille.inria.fr/pharo/view/Cog/)
>
> On 2011-08-23, at 21:28, Ilmari Vacklin wrote:
> > Using Pharo 1.3, I'm trying to load system fonts into the image. However, if I the "Launch" button next to "Update fonts from system", nothing seems to happen. What is the expected behaviour of the button?
Aug. 24, 2011
[Pharo-project] Slides of Pharo Roadmap talk Monday
by Marcus Denker
SlideShare: http://www.slideshare.net/esug/pharo-roadmap
PDF: http://esug.org/data/ESUG2011/Slides/22-Monday/03-22-ESUG-PharoRoadmap.pdf
--
Marcus Denker -- http://marcusdenker.de
Aug. 24, 2011
[Pharo-project] Fwd: [Esug-list] Slowly uploading ESUG Slides
by Marcus Denker
Begin forwarded message:
> Subject: [Esug-list] Slowly uploading ESUG Slides
> To: ESUG Members <esug-list(a)lists.esug.org>
>
> Hi,
>
> We are starting to upload the Slides of ESUG 2011:
>
> SlideShare: http://www.slideshare.net/esug/
> Archive (PDF): http://esug.org/data/ESUG2011/Slides/
>
> I will tweet every uploaded slide here: http://twitter.com/#!/esugsmalltalk
>
--
Marcus Denker -- http://marcusdenker.de
Aug. 24, 2011
Re: [Pharo-project] little uMorphic progress
by Pavel Krivanek
Only with the startup scripts. In fact this will need special UIManager too ;-)
I would like to prepare reorganization script. The question is how to
name the packages. Unfortunately Morphic is one package so we cannot
use something like Morphic-Core etc...
Of course all content of uMorphic may be in more than one package and
this packages will then be loaded and initialized at once. Do you have
some suggestions how to name the packages? I would like to do this
reorganization as soon as possible. With a lot of next changes in the
image it will be more complicated in future.
-- Pavel
On Wed, Aug 24, 2011 at 11:20 AM, Stéphane Ducasse
<stephane.ducasse(a)inria.fr> wrote:
> ***excellent***
> thanks.
> How do we interact with the resulting image :)
>
> Stef
>
> On Aug 23, 2011, at 10:44 PM, Pavel Krivanek wrote:
>
>> This is shold be the list of classes (38) and methods (695)
>>
>> Project
>> Morph
>> WorldState
>> GrafPort
>> MorphicEvent
>> UserInputEvent
>> ShortIntegerArray
>> MorphicEventDispatcher
>> MouseEvent
>> KeyboardEvent
>> MouseMoveEvent
>> Color
>> BorderStyle
>> Form
>> TEasilyThemed
>> MorphicUIManager
>> Canvas
>> ColorMappingCanvas
>> ShadowDrawingCanvas
>> MouseOverHandler
>> DropEvent
>> MouseButtonEvent
>> DamageRecorder
>> TextStopConditions
>> ShortRunArray
>> MorphExtension
>> HandMorph
>> BorderedMorph
>> PasteUpMorph
>> FormCanvas
>> MouseWheelEvent
>> MorphicAlarm
>> StepMessage
>> LayoutPolicy
>> EventHandler
>> MouseClickState
>> CombinedChar
>> SimpleBorder
>>
>>
>> BitBlt class->#asGrafPort
>> BorderStyle->#color
>> BorderStyle->#frameRectangle:on:
>> BorderStyle->#trackColorFrom:
>> BorderStyle->#hasFillStyle
>> BorderStyle->#style
>> BorderStyle->#width
>> BorderStyle->#releaseCachedState
>> BorderStyle class->#default
>> BorderStyle class->#width:color:
>> BorderedMorph->#initialize
>> BorderedMorph->#borderStyle
>> BorderedMorph->#borderInitialize
>> BorderedMorph->#borderWidth:
>> BorderedMorph->#borderWidth
>> Canvas->#fullDraw
>> Canvas->#fillRectangle:fillStyle:borderStyle:
>> Canvas->#line:to:width:color:
>> Canvas->#frameRectangle:width:color:
>> Canvas->#translucentImage:at:sourceRect:
>> Canvas->#paintImage:at:sourceRect:
>> Canvas->#fillRectangle:color:
>> Canvas->#drawImage:at:sourceRect:
>> Canvas->#drawImage:at:
>> Canvas->#translucentImage:at:
>> Canvas->#seesNothingOutside:
>> Canvas->#roundCornersOf:during:
>> Canvas->#frameRectangle:color:
>> Canvas->#asShadowDrawingCanvas
>> Canvas->#shadowColor:
>> Canvas->#fillRectangle:fillStyle:
>> Canvas->#flush
>> Canvas->#fullDrawMorph:
>> Canvas->#asShadowDrawingCanvas:
>> Canvas->#drawMorph:
>> Canvas->#paintImage:at:
>> Canvas->#draw:
>> Color->#fillRectangle:on:
>> ColorMappingCanvas->#translateBy:during:
>> ColorMappingCanvas->#frameAndFillRectangle:fillColor:borderWidth:borderColor:
>> ColorMappingCanvas class->#on:
>> CombinedChar->#base
>> CombinedChar->#simpleAdd:
>> CombinedChar->#combinesWith:
>> CombinedChar->#add:
>> CombinedChar->#combined
>> CombinedChar class->#isDiacriticals:
>> CombinedChar class->#isCompositionCharacter:
>> CombinedChar class->#parseCompositionMappingFrom:
>> CompiledMethodTrailer->#decodeSourcePointer
>> DamageRecorder->#recordInvalidRect:
>> DamageRecorder->#doFullRepain
>> DamageRecorder->#invalidRectsFullBounds:
>> DamageRecorder->#reset
>> DamageRecorder->#updateIsNeeded
>> DamageRecorder class->#new
>> DropEvent->#wasHandled
>> DropEvent->#type
>> DropEvent->#wasHandled:
>> DropEvent->#cursorPoint
>> DropEvent->#contents
>> DropEvent->#copyHandlerState:
>> DropEvent->#setPosition:contents:hand:
>> DropEvent->#sentTo:
>> DropEvent->#resetHandlerFields
>> EventHandler->#handlesMouseOverDragging:
>> EventHandler->#messageLis
>> EventHandler->#send:to:withEvent:fromMorph:
>> EventHandler->#methodRefList
>> EventHandler->#doubleClick:fromMorph:
>> EventHandler->#veryDeepFixupWith:
>> EventHandler->#mouseDownSelector
>> EventHandler->#mouseStillDownSelector
>> EventHandler->#handlesMouseOver
>> EventHandler->#keyStroke:fromMorph
>> EventHandler->#mouseStillDown:fromMorph
>> EventHandler->#mouseUpSelector
>> EventHandler->#handlesClickOrDrag:
>> EventHandler->#handlesMouseStillDown:
>> EventHandler->#on:send:to:
>> EventHandler->#replaceSendsIn:with:
>> EventHandler->#allRecipients
>> EventHandler->#mouseUp:fromMorph
>> EventHandler->#handlesMouseMove:
>> EventHandler->#mouseLeave:fromMorph
>> EventHandler->#mouseStillDownRecipient
>> EventHandler->#mouseEnter:fromMorph
>> EventHandler->#startDrag:fromMorph:
>> EventHandler->#click:fromMorph:
>> EventHandler->#printOn:
>> EventHandler->#handlesMouseDown:
>> EventHandler->#handlesGestureStart:
>> EventHandler->#onGestureSend:to:
>> EventHandler->#fixReversedValueMessages
>> EventHandler->#mouseDown:fromMorph:
>> EventHandler->#handlesKeyboard:
>> EventHandler->#mouseEnterDragging:fromMorph:
>> EventHandler->#mouseMove:fromMorph:
>> EventHandler->#on:send:to:withValue:
>> EventHandler->#doubleClickTimeout:fromMorph:
>> EventHandler->#mouseLeaveDragging:fromMorph:
>> EventHandler->#firstMouseSelector
>> Form->#defaultCanvasClass
>> Form->#getCanvas
>> FormCanvas->#clipRect
>> FormCanvas->#postCopy
>> FormCanvas->#clipBy:during:
>> FormCanvas->#isVisible:
>> FormCanvas->#translateBy:during:
>> FormCanvas->#for
>> FormCanvas->#resetGrafPort
>> FormCanvas->#copyOrigin:clipRect:
>> FormCanvas->#dept
>> FormCanvas->#infiniteFillRectangle:fillStyle:
>> FormCanvas->#contentsOfArea:into:
>> FormCanvas->#frameAndFillRectangle:fillColor:borderWidth:borderColor:
>> FormCanvas->#portClass
>> FormCanvas->#setFillColor:
>> FormCanvas->#copyClipRect:
>> FormCanvas->#finish
>> FormCanvas->#copyOffset:clipRect:
>> FormCanvas->#fillRectangle:basicFillStyle:
>> FormCanvas->#showAt:invalidRects:
>> FormCanvas->#roundCornersOf:in:during:
>> FormCanvas->#setForm:
>> FormCanvas->#fillColor:
>> FormCanvas->#origin
>> FormCanvas->#exten
>> FormCanvas->#reset
>> FormCanvas->#image:at:sourceRect:rule:
>> FormCanvas->#line:to:width:color:
>> FormCanvas->#allocateForm:
>> FormCanvas->#setOrigin:clipRect:
>> FormCanvas->#copyOffset:
>> FormCanvas->#setClearColor:
>> FormCanvas->#frameAndFillRectangle:fillColor:borderWidth:topLeftColor:bottomRightColor:
>> FormCanvas class->#extent:depth:
>> FormCanvas class->#on:
>> GrafPort->#fillRect:offset:
>> GrafPort->#alphaBits:
>> GrafPort->#image:at:sourceRect:rule:
>> GrafPort->#frameRectRight:width:
>> GrafPort->#fillPattern:
>> GrafPort->#frameRect:borderWidth:
>> GrafPort->#copyBits
>> GrafPort->#clippedBy:
>> GrafPort->#frameRectBottom:height:
>> HandMorph->#updateCacheCanvas:
>> HandMorph->#newKeyboardFocus:
>> HandMorph->#sendEvent:focus:
>> HandMorph->#waitForClicksOrDrag:event:selectors:threshold:
>> HandMorph->#deleteBalloonTarget:
>> HandMorph->#keyboardListeners
>> HandMorph->#moveToEvent:
>> HandMorph->#handleEvent:
>> HandMorph->#needsToBeDrawn
>> HandMorph->#mouseTrailFrom:
>> HandMorph->#position:
>> HandMorph->#generateKeyboardEvent:
>> HandMorph->#grabMorph:
>> HandMorph->#noticeMouseOver:event:
>> HandMorph->#newMouseFocus:
>> HandMorph->#sendMouseEvent:
>> HandMorph->#halo
>> HandMorph->#hasChanged
>> HandMorph->#isHandMorp
>> HandMorph->#visible:
>> HandMorph->#processEvents
>> HandMorph->#initialize
>> HandMorph->#sendEvent:focus:clear:
>> HandMorph->#dropMorphs:
>> HandMorph->#releaseMouseFocus
>> HandMorph->#changed
>> HandMorph->#removePendingHaloFor:
>> HandMorph->#waitForClicksOrDrag:event:
>> HandMorph->#dropMorphs
>> HandMorph->#mouseFocus
>> HandMorph->#generateMouseEvent:
>> HandMorph->#keyboardFocus
>> HandMorph->#invalidRect:from:
>> HandMorph->#dropMorph:event:
>> HandMorph->#position
>> HandMorph->#fullDrawOn:
>> HandMorph->#mouseListeners
>> HandMorph->#fullBounds
>> HandMorph->#restoreSavedPatchOn:
>> HandMorph->#resetClickState
>> HandMorph->#sendKeyboardEvent:
>> HandMorph->#cursorBounds
>> HandMorph->#releaseKeyboardFocus
>> HandMorph->#shadowForm
>> HandMorph->#savePatchFrom:
>> HandMorph->#mouseOverHandler
>> HandMorph->#sendFocusEvent:to:clear:
>> HandMorph->#eventListeners
>> HandMorph->#grabMorph:from:
>> HandMorph->#shadowOffse
>> HandMorph->#showTemporaryCursor:hotSpotOffset:
>> HandMorph->#releaseMouseFocus:
>> HandMorph->#initForEvents
>> HandMorph->#drawOn:
>> HandMorph->#newMouseFocus:event:
>> HandMorph->#showTemporaryCursor:
>> HandMorph->#nonCachingFullDrawOn:
>> HandMorph->#mouseFocus:
>> HandMorph->#balloonHelp:
>> HandMorph->#removePendingBalloonFor:
>> HandMorph->#sendListenEvent:to:
>> HandMorph->#balloonHelp
>> HandMorph->#keyboardFocus:
>> HandMorph class->#initialize
>> KeyboardEvent->#keyCharacter
>> KeyboardEvent->#scanCode:
>> KeyboardEvent->#sentTo:
>> KeyboardEvent->#isKeyboard
>> KeyboardEvent->#setType:buttons:position:keyValue:charCode:hand:stamp:
>> LayoutPolicy->#indexForInserting:at:in:
>> LayoutPolicy->#layout:in:
>> LayoutPolicy->#minExtentOf:in:
>> LayoutPolicy->#isTableLayout
>> LayoutPolicy->#isProportionalLayout
>> LayoutPolicy->#flushLayoutCache
>> Morph->#enableDrag:
>> Morph->#handlesMouseStillDown:
>> Morph->#handleDropMorph:
>> Morph->#submorphsDo:
>> Morph->#borderWidth
>> Morph->#repelsMorph:event:
>> Morph->#ownerChanged
>> Morph->#handleMouseEnter:
>> Morph->#extent
>> Morph->#shadowColor
>> Morph->#defaultYellowButtonMenuEnabled
>> Morph->#handleListenEvent:
>> Morph->#right
>> Morph->#exten
>> Morph->#mouseEnterDragging:
>> Morph->#handlesKeyboard:
>> Morph->#processEvent:using:
>> Morph->#wantsRoundedCorners
>> Morph->#allOwnersDo:
>> Morph->#topRendererOrSelf
>> Morph->#valueOfProperty:
>> Morph->#privateMoveBy:
>> Morph->#ownerThatIsA:
>> Morph->#areasRemainingToFill:
>> Morph->#removeAlarm:
>> Morph->#handleMouseDown:
>> Morph->#isWorldMorp
>> Morph->#drawOn:
>> Morph->#drawRolloverBorderOn:
>> Morph->#drawSubmorphsOn:
>> Morph->#visible
>> Morph->#hasTranslucentColor
>> Morph->#blueButtonUp:
>> Morph->#formerPosition:
>> Morph->#removeProperty:
>> Morph->#hasSubmorphs
>> Morph->#boundsWithinCorners
>> Morph->#outerBounds
>> Morph->#addMorphBack:
>> Morph->#otherProperties
>> Morph->#top
>> Morph->#imageFormForRectangle:
>> Morph->#layoutBounds:
>> Morph->#layoutBounds
>> Morph->#handleMouseWheel:
>> Morph->#handlesMouseDown:
>> Morph->#snapToEdgeIfAppropriate
>> Morph->#eventHandler
>> Morph->#expandFullBoundsForRolloverBorder:
>> Morph->#bounds:
>> Morph->#addMorph:inFrontOf:
>> Morph->#drawMouseDownHighlightOn:
>> Morph->#handleMouseMove:
>> Morph->#transformFrom:
>> Morph->#imageForm:forRectangle:
>> Morph->#drawErrorOn:
>> Morph->#referencePosition:
>> Morph->#clipSubmorphs:
>> Morph->#highlightedForMouseDown
>> Morph->#referencePosition
>> Morph->#handlesMouseOverDragging:
>> Morph->#removedMorph:
>> Morph->#isRenderer
>> Morph->#owne
>> Morph->#firstOwnerSuchThat:
>> Morph->#hasRolloverBorder:
>> Morph->#openInWorld:
>> Morph->#keyDown:
>> Morph->#dropEnabled:
>> Morph->#handleMouseLeave:
>> Morph->#assureExtension
>> Morph->#fullContainsPoint:
>> Morph->#hasOwner:
>> Morph->#morphicLayerNumber
>> Morph->#initialize
>> Morph->#mouseStillDownStepRate
>> Morph->#goHome
>> Morph->#layoutInset
>> Morph->#separateDragAndDrop
>> Morph->#keyUp:
>> Morph->#step
>> Morph->#addMorphInLayer:
>> Morph->#borderStyle
>> Morph->#wantsToBeTopmost
>> Morph->#shouldGetStepsFrom:
>> Morph->#handleEvent:
>> Morph->#rejectDropEvent:
>> Morph->#justDroppedInto:event:
>> Morph->#expandFullBoundsForDropShadow:
>> Morph->#handleKeystroke:
>> Morph->#handlerForYellowButtonDown:
>> Morph->#handlesMouseWheel:
>> Morph->#invalidRect:from:
>> Morph->#hResizing
>> Morph->#innerBounds
>> Morph->#allNonSubmorphMorphs
>> Morph->#wantsSteps
>> Morph->#doLayoutIn:
>> Morph->#keyboardFocusChange
>> Morph->#wantsToBeDroppedInto:
>> Morph->#privateAddMorph:atIndex:
>> Morph->#adjustLayoutBounds
>> Morph->#visibleClearArea
>> Morph->#highlightedForDrop
>> Morph->#enableDragNDrop:
>> Morph->#fullBounds
>> Morph->#keepsTransform
>> Morph->#handlesMouseOver:
>> Morph->#minHeight
>> Morph->#mouseWheel:
>> Morph->#left
>> Morph->#defaultColor
>> Morph->#shouldDropOnMouseUp
>> Morph->#clearArea
>> Morph->#enableDrop:
>> Morph->#bounds
>> Morph->#addedMorph:
>> Morph->#stopSteppingSelector:
>> Morph->#dragEnabled:
>> Morph->#transformedFrom:
>> Morph->#justGrabbedFrom:
>> Morph->#outOfWorld:
>> Morph->#mouseDownPriority
>> Morph->#handleFocusEvent:
>> Morph->#mouseStillDownThreshold
>> Morph->#handleKeyUp:
>> Morph->#invalidRect:
>> Morph->#valueOfProperty:ifAbsent:
>> Morph->#wantsToBeCachedByHand
>> Morph->#isTextMorph
>> Morph->#transformFromWorl
>> Morph->#rejectDropMorphEvent:
>> Morph->#removeMorph:
>> Morph->#slideBackToFormerSituation:
>> Morph->#cornerStyle
>> Morph->#privateInvalidateMorph:
>> Morph->#imageForm
>> Morph->#positio
>> Morph->#isLocked
>> Morph->#hasRolloverBorder
>> Morph->#keyStroke:
>> Morph->#mouseLeave:
>> Morph->#rejectsEvent:
>> Morph->#changed
>> Morph->#privateOwner
>> Morph->#allMorphsDo:
>> Morph->#mouseUp:
>> Morph->#handlerForBlueButtonDown:
>> Morph->#drawDropHighlightOn:
>> Morph->#position:
>> Morph->#addMorphInFrontOfLayer:
>> Morph->#submorphBounds
>> Morph->#formerPosition
>> Morph->#formerOwner:
>> Morph->#shadowForm
>> Morph->#isSticky
>> Morph->#hasProperty:
>> Morph->#isInWorld
>> Morph->#stepTime
>> Morph->#mouseEnter:
>> Morph->#allMorphsInto:
>> Morph->#fillStyle
>> Morph->#mouseLeaveDragging:
>> Morph->#layoutPolicy
>> Morph->#containsPoint:event:
>> Morph->#clippingBounds
>> Morph->#dropHighlightColor
>> Morph->#withAllOwnersDo:
>> Morph->#rotationCenter
>> Morph->#openInWorld
>> Morph->#outermostWorldMorph
>> Morph->#transformedBy:
>> Morph->#handleMouseUp:
>> Morph->#dockingBars
>> Morph->#grabTransform
>> Morph->#isHandMorp
>> Morph->#processEvent:
>> Morph->#allMorphs
>> Morph->#shadowOffsetRectangle
>> Morph->#aboutToBeGrabbedBy:
>> Morph->#isDockingBar
>> Morph->#submorphs
>> Morph->#formerOwner
>> Morph->#drawDropShadowOn:
>> Morph->#morphicLayerNumberWithin:
>> Morph->#submorphsReverseDo
>> Morph->#layoutProperties
>> Morph->#mouseMove:
>> Morph->#adhereToEdge:
>> Morph->#privateRemove:
>> Morph->#clipSubmorphs
>> Morph->#minWidth
>> Morph->#fullDrawOn:
>> Morph->#startStepping:at:arguments:stepTime:
>> Morph->#addMorph
>> Morph->#setProperty:toValue:
>> Morph->#noteNewOwner:
>> Morph->#handlesDropShadowInHand
>> Morph->#layoutChanged
>> Morph->#defaultBounds
>> Morph->#hasDropShadow
>> Morph->#privateFullBounds
>> Morph->#firstSubmorph
>> Morph->#handleMouseOver:
>> Morph->#vanishAfterSlidingTo:event:
>> Morph->#arrangeToStartSteppingIn:
>> Morph->#alarmScheduler
>> Morph->#world
>> Morph->#privateFullMoveBy:
>> Morph->#enableDragNDrop
>> Morph->#intoWorld:
>> Morph->#containsPoint
>> Morph->#initializeExtension
>> Morph->#handlerForMouseDown:
>> Morph->#defaultEventDispatcher
>> Morph->#bottom
>> Morph->#handleKeyDown:
>> Morph->#vResizing
>> Morph class->#defaultYellowButtonMenuEnabled
>> Morph class->#initialize
>> MorphExtension->#layoutProperties
>> MorphExtension->#clipSubmorphs
>> MorphExtension->#locked
>> MorphExtension->#clipSubmorphs:
>> MorphExtension->#hasProperty:
>> MorphExtension->#removeProperty:
>> MorphExtension->#initialize
>> MorphExtension->#assureOtherProperties
>> MorphExtension->#fillStyle
>> MorphExtension->#valueOfProperty:
>> MorphExtension->#setProperty:toValue:
>> MorphExtension->#otherProperties
>> MorphExtension->#borderStyle
>> MorphExtension->#visible
>> MorphExtension->#eventHandler
>> MorphExtension->#initializeOtherProperties
>> MorphExtension->#valueOfProperty:ifAbsent:
>> MorphExtension->#sticky
>> MorphExtension->#layoutPolicy
>> MorphExtension->#borderStyle:
>> MorphExtension->#cornerStyle
>> MorphExtension->#removeOtherProperties
>> MorphicAlarm->#value:
>> MorphicAlarm->#scheduledTime
>> MorphicAlarm->#scheduledTime:
>> MorphicAlarm class->#scheduledAt:receiver:selector:arguments:
>> MorphicEvent->#isWindowEvent
>> MorphicEvent->#resetHandlerFields
>> MorphicEvent->#isMove
>> MorphicEvent->#isMouseOver
>> MorphicEvent->#hand
>> MorphicEvent->#copyHandlerState:
>> MorphicEvent->#isMouse
>> MorphicEvent->#isKeyboard
>> MorphicEvent->#isDropEvent
>> MorphicEventDispatcher->#dispatchDropEvent:with:
>> MorphicEventDispatcher->#dispatchEvent:with:
>> MorphicEventDispatcher->#dispatchDefault:with:
>> MorphicEventDispatcher->#dispatchMouseDown:with:
>> MorphicUIManager->#grafPort
>> MorphicUIManager->#restoreDisplay
>> MorphicUIManager->#checkForNewDisplaySize
>> MorphicUIManager->#currentWorld
>> MorphicUIManager->#newDisplayDepthNoRestore:
>> MouseButtonEvent->#blueButtonChanged
>> MouseButtonEvent->#setType:position:which:buttons:hand:stamp:
>> MouseButtonEvent->#sentTo:
>> MouseClickState->#client:click:dblClick:dblClickTime:dblClickTimeout:drag:threshold:event:
>> MouseClickState->#doubleClick
>> MouseClickState->#click
>> MouseClickState->#drag:
>> MouseClickState->#doubleClickTimeout
>> MouseClickState->#printOn:
>> MouseClickState->#handleEvent:from:
>> MouseEvent->#asMouseOver
>> MouseEvent->#sentTo:
>> MouseEvent->#isMouseDown
>> MouseEvent->#isDraggingEvent
>> MouseEvent->#asMouseEnter
>> MouseEvent->#asMouseLeave
>> MouseEvent->#cursorPoint
>> MouseEvent->#isMouseUp
>> MouseEvent->#asMouseMove
>> MouseEvent->#isMouseWheel
>> MouseEvent->#setType:position:buttons:hand:
>> MouseEvent->#anyButtonPressed
>> MouseEvent->#yellowButtonPressed
>> MouseEvent->#setType:
>> MouseEvent->#isMouse
>> MouseEvent->#blueButtonPressed
>> MouseEvent class->#anyButton
>> MouseEvent class->#blueButton
>> MouseEvent class->#yellowButton
>> MouseMoveEvent->#setType:startPoint:endPoint:trail:buttons:hand:stamp:
>> MouseMoveEvent->#sentTo:
>> MouseMoveEvent->#transformBy:
>> MouseMoveEvent->#isMove
>> MouseOverHandler->#rememberOverList
>> MouseOverHandler->#informMouseLeaveToLeftMorphsUsing:
>> MouseOverHandler->#inform:to:originatedFrom:ifNotFocusedDo:
>> MouseOverHandler->#initializeProcessMouseOver
>> MouseOverHandler->#handleAsMouseLeave:
>> MouseOverHandler->#initialize
>> MouseOverHandler->#handleAsMouseOver:
>> MouseOverHandler->#is:withFocusOver:
>> MouseOverHandler->#transform:from:andSendTo:
>> MouseOverHandler->#initializeTrackedMorphs
>> MouseOverHandler->#hasLeftMorphsChanged
>> MouseOverHandler->#handleAsMouseEnter:
>> MouseOverHandler->#noticeMouseOver:event:
>> MouseOverHandler->#keepLeftMorphsOrder
>> MouseOverHandler->#processMouseOver:
>> MouseWheelEvent->#direction:
>> MouseWheelEvent->#sentTo:
>> MouseWheelEvent->#direction
>> MouseWheelEvent->#setType:position:direction:buttons:hand:stamp:
>> MouseWheelEvent->#isMouseWheel
>> Object->#currentWorld
>> PasteUpMorph->#flashRects:color:
>> PasteUpMorph->#morphToGrab:
>> PasteUpMorph->#repelsMorph:event:
>> PasteUpMorph->#invalidRect:from:
>> PasteUpMorph->#world
>> PasteUpMorph->#listOfSteppingMorphs
>> PasteUpMorph->#acceptDroppingMorph:event:
>> PasteUpMorph->#dropEnabled
>> PasteUpMorph->#displayWorldSafely
>> PasteUpMorph->#defaultBorderWidth
>> PasteUpMorph->#morphToDropFrom:
>> PasteUpMorph->#allMorphsDo:
>> PasteUpMorph->#handlerForMouseDown:
>> PasteUpMorph->#runStepMethods
>> PasteUpMorph->#cleanseStepList
>> PasteUpMorph->#stopStepping:
>> PasteUpMorph->#handlesMouseDown:
>> PasteUpMorph->#position:
>> PasteUpMorph->#steppingMorphsNotInWorld
>> PasteUpMorph->#griddingOn
>> PasteUpMorph->#addMorphInLayer:
>> PasteUpMorph->#mouseDown:
>> PasteUpMorph->#resizeBackgroundMorph
>> PasteUpMorph->#shouldGetStepsFrom:
>> PasteUpMorph->#handleFatalDrawingError:
>> PasteUpMorph->#privateOuterDisplayWorld
>> PasteUpMorph->#startSteppingSubmorphsOf:
>> PasteUpMorph->#startStepping:at:selector:arguments:stepTime:
>> PasteUpMorph->#initialize
>> PasteUpMorph->#backgroundMorph
>> PasteUpMorph->#drawOn:
>> PasteUpMorph->#addHand:
>> PasteUpMorph->#isWorldMorph
>> PasteUpMorph->#defaultColor
>> PasteUpMorph->#bringTopmostsToFront
>> PasteUpMorph->#hands
>> PasteUpMorph->#cleanseOtherworldlySteppers
>> PasteUpMorph->#fullRepaintNeeded
>> PasteUpMorph->#stopStepping:selector:
>> PasteUpMorph->#assuredCanvas
>> PasteUpMorph->#startStepping:
>> PasteUpMorph->#displayWorld
>> PasteUpMorph->#addMorphFront:
>> PasteUpMorph->#viewBox
>> PasteUpMorph->#removeAlarm:for:
>> PasteUpMorph->#removeHand:
>> PasteUpMorph->#extent:
>> PasteUpMorph->#handlesKeyboard:
>> PasteUpMorph->#becomeActiveDuring:
>> PasteUpMorph->#defaultBorderColor
>> PasteUpMorph->#viewBox:
>> PasteUpMorph->#handsDo:
>> PasteUpMorph->#activeHand
>> PasteUpMorph->#restoreMorphicDisplay
>> PasteUpMorph->#processEvent:using:
>> PasteUpMorph->#doOneCycle
>> PasteUpMorph->#wantsDroppedMorph:event:
>> PasteUpMorph->#canvas
>> PasteUpMorph->#stepListSize
>> PasteUpMorph class->#disableDeferredUpdates
>> ShadowDrawingCanvas->#mapColor:
>> ShadowDrawingCanvas->#shadowColor:
>> ShadowDrawingCanvas->#on:
>> ShortIntegerArray->#size
>> ShortIntegerArray->#at:
>> ShortIntegerArray->#at:put:
>> ShortIntegerArray class->#new:
>> ShortIntegerArray class->#initialize
>> ShortRunArray->#setRunAt:toLength:value:
>> ShortRunArray->#setRuns:values:
>> ShortRunArray class->#runs:values:
>> ShortRunArray class->#newFrom:
>> ShortRunArray class->#initialize
>> SimpleBorder->#bottomRightColor
>> SimpleBorder->#initialize
>> SimpleBorder->#color:
>> SimpleBorder->#style
>> SimpleBorder->#color
>> SimpleBorder->#baseColor
>> SimpleBorder->#frameRectangle:on:
>> SimpleBorder->#topLeftColor
>> SimpleBorder->#width
>> SimpleBorder->#drawLineFrom:to:on:
>> SimpleBorder->#baseColor:
>> SimpleBorder->#width:
>> SmalltalkImage->#cleanUpAfterMorphicInitialization
>> StepMessage->#stepTime
>> StepMessage->#stepTime:
>> StepMessage->#printOn:
>> StepMessage class->#scheduledAt:stepTime:receiver:selector:arguments:
>> TextStopConditions->#postCopy
>> TextStopConditions->#at:put:
>> TextStopConditions->#initialize
>> TextStopConditions->#crossedX:
>> TextStopConditions->#endOfRun:
>> UserInputEvent->#wasHandled:
>> UserInputEvent->#type
>> UserInputEvent->#handler
>> UserInputEvent->#resetHandlerFields
>> UserInputEvent->#position
>> UserInputEvent->#shiftPressed
>> UserInputEvent->#buttons
>> UserInputEvent->#wasHandled
>> UserInputEvent->#handler:
>> UserInputEvent->#controlKeyPressed
>> UserInputEvent->#transformBy:
>> UserInputEvent->#copyHandlerState:
>> UserInputEvent->#transformedBy:
>> WorldState->#stopStepping:
>> WorldState->#adjustWakeupTimes:
>> WorldState->#stepListSize
>> WorldState->#alarmSortBlock
>> WorldState->#runStepMethodsIn:
>> WorldState->#addHand:
>> WorldState->#handsReverseDo:
>> WorldState->#checkIfUpdateNeeded
>> WorldState->#hands
>> WorldState->#doFullRepaint
>> WorldState->#doDeferredUpdatingFor:
>> WorldState->#doOneCycleFor:
>> WorldState->#initialize
>> WorldState->#displayWorldSafely:
>> WorldState->#assuredCanvas
>> WorldState->#doOneCycleNowFor:
>> WorldState->#displayWorld:submorphs:
>> WorldState->#drawWorld:submorphs:invalidAreasOn:
>> WorldState->#canvas:
>> WorldState->#listOfSteppingMorphs
>> WorldState->#removeHand:
>> WorldState->#triggerAlarmsBefore:
>> WorldState->#stepListSortBlock
>> WorldState->#handleFatalDrawingError:
>> WorldState->#viewBox:
>> WorldState->#cleanseStepListForWorld:
>> WorldState->#stopStepping:selector:
>> WorldState->#canvas
>> WorldState->#runLocalStepMethodsIn:
>> WorldState->#recordDamagedRect:
>> WorldState->#forceDamageToScreen:
>> WorldState->#removeAlarm:for:
>> WorldState->#activeHand
>> WorldState->#adjustAlarmTimes:
>> WorldState->#serverMode
>> WorldState->#handsDo:
>> WorldState->#interCyclePause:
>> WorldState->#selectHandsToDrawForDamage:
>> WorldState->#alarms
>> WorldState->#startStepping:at:selector:arguments:stepTime:
>> WorldState->#adjustWakeupTimesIfNecessary
>> WorldState->#viewBox
>> WorldState class->#deferredUIMessages
>> WorldState class->#initialize
>> WorldState class->#debugShowDamage
>> WorldState class->#addDeferredUIMessage:
>> WorldState class->#serverMode
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> On Tue, Aug 23, 2011 at 4:31 PM, Pavel Krivanek
>> <pavel.krivanek(a)gmail.com> wrote:
>>> Hi,
>>>
>>> uMorphic is an experimental image based on Pharo Kernel (+Gofer) that
>>> contains only core of Morphic functionality. It has no windows or
>>> fonts, menus nor halos support, it can only open a basic Morph in the
>>> world and drag it with mouse. The purpose of this image is to provide
>>> information for Morphic packages reorganization.
>>>
>>> Now the basic cleaning was processed on this package so when it is
>>> loaded to basic gofer image, no new Undeclared nor unimplemented
>>> messages are added! :-) So it should be quite stable too.
>>>
>>> It has 2,9 MB and it modifies behavior of 32 methods.
>>>
>>> You may download and try it here:
>>> http://windmap.cz/playground/trash/uMorphic.zip
>>>
>>> Cheers,
>>> -- Pavel
>>>
>>
>
>
>
Aug. 24, 2011
Re: [Pharo-project] expanding text morph
by Gary Chambers
In the following example the expander resizes
|textMorph|
textMorph := UITheme builder newText: ''.
textMorph
hResizing: #spaceFill;
borderWidth: 1.
(UITheme builder newColumn: {
UITheme builder newExpander: 'One' for: textMorph.
UITheme builder newExpander: 'Two' for: Morph new}) openInWindow.
textMorph contentsWrapped: 'Some text here
use #contentsWrapped: to change text'
In general, if the surrounding morph has #shrinkWrap constraints then
changes to the (minimum) dimensions of its submorphs will propagate
resulting in a change of size for the surrounding morph.
Regards, Gary
----- Original Message -----
From: "Tudor Girba" <tudor(a)tudorgirba.com>
To: <Pharo-project(a)lists.gforge.inria.fr>
Sent: Tuesday, August 23, 2011 1:36 PM
Subject: Re: [Pharo-project] expanding text morph
Thanks, Gary!
And now the next question:
If I place this one in a surrounding pane / expander / tab, how do I get the
surrounding morph to resize when the text changes?
Cheers,
Doru
On 22 Aug 2011, at 12:15, Gary Chambers wrote:
> Hi Doru
>
>
> |textMorph|
> textMorph := UITheme builder newText: ''.
> textMorph
> hResizing: #spaceFill;
> borderWidth: 1.
> (UITheme builder newColumn: {textMorph}) openInWindow.
> textMorph contentsWrapped: 'Some text here
>
> Get a halo and inspect the text morph
> then use #contentsWrapped: to change text
>
>
> and see the results!
>
> #rigid hResizing also works.'
>
>
>
> Have fun!
>
> Regards, Gary
>
> ----- Original Message ----- From: "Tudor Girba" <tudor(a)tudorgirba.com>
> To: "Pharo Development" <pharo-project(a)lists.gforge.inria.fr>
> Sent: Sunday, August 21, 2011 11:57 PM
> Subject: [Pharo-project] expanding text morph
>
>
> Hi,
>
> I would like to create a Text Morph that wraps the text horizontally, and
> expands the height to fit the text. Thus, this morph would never offer
> scrolling.
>
> How could I do that?
>
> Cheers,
> Doru
>
>
> --
> www.tudorgirba.com
>
> "There are no old things, there are only old ways of looking at them."
>
>
>
>
>
--
www.tudorgirba.com
"Next time you see your life passing by, say 'hi' and get to know her."
Aug. 24, 2011
Re: [Pharo-project] [ANN] Big Smallapack progress on Squeak/Pharo
by Edgar J. De Cleene
On 8/23/11 5:58 PM, "Stéphane Ducasse" <stephane.ducasse(a)inria.fr> wrote:
> Kind of a sacred day then :)
>
> http://gatherer.wizards.com/Pages/Card/Details.aspx?multiverseid=184608
>
> Stef
As always said, life is more as Smalltalk.
Very thanks for this link.
Edgar
Aug. 24, 2011