support non-class based code completion
authorClaus Gittinger <cg@exept.de>
Sun, 03 Jul 2011 16:27:26 +0200
changeset 10051 5b7e30460ea4
parent 10050 dad59ec79a80
child 10052 96ce1c919cbe
support non-class based code completion
extensions.st
--- a/extensions.st	Sun Jul 03 16:26:37 2011 +0200
+++ b/extensions.st	Sun Jul 03 16:27:26 2011 +0200
@@ -1,5 +1,64 @@
 "{ Package: 'stx:libtool' }"!
 
+!AbstractSyntaxHighlighter class methodsFor:'api highlighting'!
+
+formatExpression:aString in:aClass elementsInto: elements
+
+    ^self formatExpression:aString in:aClass
+
+    "Created: / 25-07-2010 / 08:57:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!AbstractSyntaxHighlighter class methodsFor:'api highlighting'!
+
+formatMethod:aString in:aClass using:preferencesOrNil elementsInto: elements
+
+    ^self formatMethod:aString in:aClass using:preferencesOrNil
+
+    "Created: / 25-07-2010 / 08:58:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!AddClassChange methodsFor:'testing'!
+
+isClassDefinitionChange
+
+    ^true
+
+    "Created: / 29-10-2010 / 13:35:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!AddMethodChange methodsFor:'testing'!
+
+isMethodCodeChange
+
+    ^true
+! !
+
+!AddMethodChange methodsFor:'accessing'!
+
+source
+    ^ source
+! !
+
+!AddMethodChange methodsFor:'initialization & release'!
+
+source: aString 
+
+    source := aString.
+! !
+
+!Breakpoint methodsFor:'accessing'!
+
+icon
+
+    state == #enabled ifTrue:[^ToolbarIconLibrary brkp_obj].
+    state == #disabled ifTrue:[^ToolbarIconLibrary brkpd_obj].
+
+    ^nil
+
+    "Created: / 28-06-2011 / 08:29:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !ByteArray methodsFor:'inspecting'!
 
 inspectorExtraAttributes
@@ -29,6 +88,85 @@
     "Modified: / 06-10-2006 / 13:57:20 / cg"
 ! !
 
+!Change methodsFor:'private'!
+
+flattenOnto: aCollection 
+	aCollection add: self
+! !
+
+!Change methodsFor:'private'!
+
+flattenedChanges
+	| changes |
+	changes := OrderedCollection new.
+	self flattenOnto: changes.
+	^changes
+! !
+
+!Change methodsFor:'accessing'!
+
+removed
+
+    ^(self objectAttributeAt: #removed) ? false
+
+    "Created: / 24-10-2009 / 21:10:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Change methodsFor:'accessing'!
+
+removed: aBoolean
+
+    ^self objectAttributeAt: #removed put: aBoolean
+
+    "Created: / 24-10-2009 / 21:11:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!ChangeSet methodsFor:'utilities'!
+
+condenseChangesForRemoved
+    "remove all changes which has been removed (marked for removal
+     by aChange removed: true)"
+
+    |changesToRemove|
+
+    changesToRemove := self select:[:aChange | 
+        aChange isCompositeChange ifTrue:
+            [aChange condenseChangesForRemoved].        
+        aChange removed
+    ].
+
+    self condenseChanges:changesToRemove
+
+    "Created: / 05-11-2001 / 14:21:17 / cg"
+    "Modified: / 12-10-2006 / 16:51:27 / cg"
+! !
+
+!ChangeSet methodsFor:'private'!
+
+flattenOnto: aCollection 
+
+    self do:[:change|change flattenOnto: aCollection]
+! !
+
+!ChangeSet methodsFor:'private'!
+
+flattenedChanges
+	| changes |
+	changes := OrderedCollection new.
+	self flattenOnto: changes.
+	^changes
+! !
+
+!ChangeSet methodsFor:'debugging support'!
+
+inspector2TabBrowser
+
+    ^self newInspector2Tab
+        label: 'Changes';    
+        priority: 75;
+        application: (Tools::ChangeSetBrowser on: self)
+! !
+
 !Character methodsFor:'inspecting'!
 
 inspectorExtraAttributes
@@ -49,6 +187,18 @@
     "Created: / 22-10-2006 / 03:52:20 / cg"
 ! !
 
+!CharacterArray methodsFor:'debugging support'!
+
+inspector2TabText
+
+    ^self newInspector2Tab
+        label: 'String';
+        priority: 75;
+        view: ((ScrollableView for:TextView) contents: self; yourself)
+
+    "Created: / 17-02-2008 / 10:10:50 / janfrog"
+! !
+
 !CharacterArray methodsFor:'inspecting'!
 
 inspectorExtraAttributes
@@ -68,12 +218,36 @@
     ^ d
 
     "
-     'aouäöü' inspect
+     'aou' inspect
     "
 
     "Created: / 22-10-2006 / 03:52:20 / cg"
 ! !
 
+!ClassDescription methodsFor:'misc'!
+
+iconInBrowserForVariableNamed: varName
+    "variables for which an entry is found in the xml-spec (if any) are marked
+     with an <xml>-icon. For now, this is expecco-specific, but should be somehow
+     lifted to the base system"
+
+    (Expecco::ExpeccoXMLDecoder notNil and:
+        [self canUnderstand: #xmlSpecFor:]) ifTrue:
+            [
+            (Expecco::ExpeccoXMLDecoder xmlSpecForObject:self basicNew)
+                collect:[:spec|spec getter = varName ifTrue:
+                    [^SystemBrowser instVarOverlayXmlSpec]].
+            ].
+
+
+
+
+    ^nil
+
+    "Created: / 12-04-2011 / 16:04:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 03-07-2011 / 15:46:07 / cg"
+! !
+
 !Collection methodsFor:'inspecting'!
 
 inspectorExtraAttributes
@@ -119,6 +293,97 @@
     "
 ! !
 
+!CompositeChange methodsFor:'utilities'!
+
+condenseChangesForRemoved
+
+    self changes condenseChangesForRemoved
+! !
+
+!CompositeChange methodsFor:'private'!
+
+flattenOnto: aCollection
+
+    changes do:[:change|change flattenOnto: aCollection]
+! !
+
+!CompositeChange methodsFor:'accessing'!
+
+removed
+
+    ^changes allSatisfy: [:e|e removed]
+! !
+
+!CompositeChange methodsFor:'accessing'!
+
+removed: aBoolean
+
+    changes do:[:e|e removed: aBoolean]
+! !
+
+!CompositeRefactoryChange methodsFor:'utilities'!
+
+condenseChangesForRemoved
+
+    changes := 
+        changes reject:
+            [:chg|
+            chg isCompositeChange ifTrue:[chg condenseChangesForRemoved].
+            chg removed]
+! !
+
+!CompositeRefactoryChange methodsFor:'user interface'!
+
+inspect
+
+    ^super inspect
+
+    "
+        CompositeRefactoryChangeInspector openOn: self
+    "
+! !
+
+!CompositeRefactoryChange methodsFor:'testing'!
+
+isComplexRefactoryChange
+
+    ^changes size > 1
+
+    "Created: / 26-11-2008 / 11:56:18 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!CompositeRefactoryChange methodsFor:'testing'!
+
+isCompositeChange
+
+    ^true
+
+    "Created: / 26-11-2008 / 11:34:56 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!CompositeRefactoryChange methodsFor:'testing'!
+
+isCompositeRefactoryChange
+
+    ^true
+
+    "Created: / 26-11-2008 / 11:34:56 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!CompositeRefactoryChange methodsFor:'accessing'!
+
+removed
+
+    ^changes allSatisfy: [:e|e removed]
+! !
+
+!CompositeRefactoryChange methodsFor:'accessing'!
+
+removed: aBoolean
+
+    changes do:[:e|e removed: aBoolean]
+! !
+
 !Date methodsFor:'inspecting'!
 
 inspectorExtraAttributes
@@ -149,6 +414,578 @@
     ^ DictionaryInspectorView
 ! !
 
+!DoWhatIMeanSupport class methodsFor:'code completion-helpers'!
+
+askUserForCompletion:what for:codeView at:position from:allTheBest 
+    |list choice lastChoice|
+
+    allTheBest isEmpty ifTrue:[
+        ^ nil
+    ].
+    allTheBest size == 1 ifTrue:[
+        ^ allTheBest first
+    ].
+    list := allTheBest.
+    LastChoices notNil ifTrue:[
+        lastChoice := LastChoices at:what ifAbsent:nil.
+        lastChoice notNil ifTrue:[
+            list := 
+                    { lastChoice.
+                    nil } , (list copyWithout:lastChoice).
+        ].
+    ].
+    choice := Tools::CodeCompletionMenu 
+                openFor:codeView
+                at:position
+                with:allTheBest.
+    LastChoices isNil ifTrue:[
+        LastChoices := Dictionary new.
+    ].
+    LastChoices at:what put:choice.
+    ^ choice
+
+    "Created: / 16-02-2010 / 10:09:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!DoWhatIMeanSupport class methodsFor:'code completion-helpers'!
+
+codeCompletionForLiteralSymbol:node inClass:classOrNil codeView:codeView
+    |sym possibleCompletions best start stop oldLen newLen oldVar|
+
+    sym := node value.
+    possibleCompletions := OrderedCollection new.
+
+    Symbol allInstancesDo:[:existingSym |
+        (existingSym startsWith:sym) ifTrue:[
+            (existingSym = sym) ifFalse:[
+                possibleCompletions add:existingSym
+            ].
+        ].
+    ].
+    possibleCompletions sort.
+
+    best := possibleCompletions longestCommonPrefix.
+    (best = sym or:[(possibleCompletions includes:best) not]) ifTrue:[
+        best := self askUserForCompletion:'symbol literal' for:codeView at: node start from:possibleCompletions.
+        best isNil ifTrue:[^ self].
+    ].
+
+"/ self showInfo:best.
+
+    start := node start.
+    stop := node stop.
+    (codeView characterAtCharacterPosition:start) == $# ifTrue:[
+        start := start + 1.
+    ].
+    (codeView characterAtCharacterPosition:start) == $' ifTrue:[
+        start := start + 1.
+        stop := stop - 1.
+    ].
+
+    oldVar := (codeView textFromCharacterPosition:start to:stop) asString string withoutSeparators.
+
+    codeView
+        undoableDo:[ codeView replaceFromCharacterPosition:start to:stop with:best ]
+        info:'Completion'.
+
+    (best startsWith:oldVar) ifTrue:[
+        oldLen := stop - start + 1.
+        newLen := best size.
+        codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
+        codeView dontReplaceSelectionOnInput
+    ].
+
+    "Modified: / 16-02-2010 / 10:15:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (format): / 03-07-2011 / 15:58:45 / cg"
+! !
+
+!DoWhatIMeanSupport class methodsFor:'code completion-helpers'!
+
+codeCompletionForMessage:node inClass:cls codeView:codeView
+    |selector srchClass implClass 
+     bestSelectors selector2 bestSelectors2 allBest best info numArgs
+     newParts nSelParts oldLen newLen selectorParts 
+     findBest parentNode selectorInBest selector2InBest2
+     parser selectorsSentInCode split|
+
+    parser := Parser parseMethod:codeView contents string in:cls ignoreErrors:true ignoreWarnings:true.
+    selectorsSentInCode := parser messagesSent.
+
+    findBest := [:node :selector |
+        |srchClass bestSelectors bestPrefixes|
+
+        srchClass := self lookupClassForMessage:node inClass:cls.
+
+        srchClass notNil ifTrue:[
+            bestSelectors := Parser findBest:30 selectorsFor:selector in:srchClass forCompletion:true.
+        ] ifFalse:[
+            codeView topView withCursor:(Cursor questionMark) do:[
+                bestSelectors := Parser findBest:30 selectorsFor:selector in:nil forCompletion:true.
+            ].
+        ].
+
+        (bestSelectors includes:selector) ifTrue:[
+            bestSelectors := bestSelectors select:[:sel | sel size > selector size].
+        ].
+        bestSelectors
+    ].
+
+    selector := node selector.
+    bestSelectors := findBest value:node value:selector.
+
+    parentNode := node parent.
+
+    "/ if its a unary message AND the parent is a keyword node, look for parent completion too.
+    (node selector isUnarySelector 
+    and:[ parentNode notNil 
+    and:[ parentNode isMessage 
+    and:[ (selector2 := parentNode selector) isKeywordSelector ]]]) ifTrue:[
+        "/ srchClass2 := self lookupClassForMessage:parentNode inClass:cls.
+        selector2 := selector2,selector.
+        bestSelectors2 := findBest value:parentNode value:selector2.
+    ].
+
+    bestSelectors2 isEmptyOrNil ifTrue:[
+        allBest := bestSelectors.
+    ] ifFalse:[
+        bestSelectors isEmptyOrNil ifTrue:[
+            allBest := bestSelectors2
+        ] ifFalse:[
+            selectorInBest := (bestSelectors contains:[:sel | sel asLowercase startsWith:selector asLowercase]).
+            selector2InBest2 := (bestSelectors2 contains:[:sel | sel asLowercase startsWith:selector2 asLowercase]).
+
+            (selectorInBest not and:[ selector2InBest2 ]) ifTrue:[
+                "/ selector2 is more likely
+                allBest := bestSelectors2
+            ] ifFalse:[
+                (selectorInBest and:[ selector2InBest2 not ]) ifTrue:[
+                    "/ selector more likely
+                    allBest := bestSelectors
+                ] ifFalse:[
+                    "/ assume same likelyness
+
+                    allBest := bestSelectors isEmpty 
+                                ifTrue:[ bestSelectors2 ]
+                                ifFalse:[ bestSelectors , #(nil) , bestSelectors2 ].
+                ]
+            ].
+        ].
+    ].
+
+    allBest isEmptyOrNil ifTrue:[ ^ self ].
+
+    split := [:list :splitHow |
+        |part1 part2 all|
+
+        part1 := list select:splitHow.
+        part2 := list reject:splitHow.
+        part1 isEmpty ifTrue:[
+            all := part2.
+        ] ifFalse:[
+            part2 isEmpty ifTrue:[
+                all := part1.
+            ] ifFalse:[
+                all := part1 , part2.
+            ]
+        ].
+        all
+    ].
+
+    "/ the ones already sent in the code are moved to the top of the list.
+    allBest := split value:allBest value:[:sel | selectorsSentInCode includes:sel].
+
+    "/ the ones which are a prefix are moved towards the top of the list
+    allBest := split value:allBest value:[:sel | sel notNil and:[sel startsWith:selector]].
+
+    best := allBest first.
+    allBest size > 1 ifTrue:[
+        "allBest size < 20 ifTrue:[
+            |idx|
+
+            idx := (PopUpMenu labels:allBest) startUp.
+            idx == 0 ifTrue:[ ^ self].
+            best := allBest at:idx.
+        ] ifFalse:[
+            best := Dialog request:'Matching selectors:' initialAnswer:best list:allBest.
+
+        ]."
+        best := self askUserForCompletion:'selector' for:codeView at: node selectorParts first start from:allBest.
+        best isEmptyOrNil ifTrue:[^ self].
+        best = '-' ifTrue:[^ self].
+    ].
+
+false ifTrue:[
+    srchClass notNil ifTrue:[
+        implClass := srchClass whichClassIncludesSelector:best.
+    ] ifFalse:[
+        implClass := Smalltalk allClasses select:[:cls | (cls includesSelector:best) or:[cls class includesSelector:best]].
+        implClass size == 1 ifTrue:[
+            implClass := implClass first.
+        ] ifFalse:[
+            implClass := nil
+        ]
+    ].
+
+    info := best storeString.
+    implClass notNil ifTrue:[
+        info := implClass name , ' >> ' , info.
+    ].
+    self information:info.
+].
+
+    best ~= selector ifTrue:[
+        numArgs := best numArgs.
+        (bestSelectors2 notEmptyOrNil and:[bestSelectors2 includes:best]) ifTrue:[
+            selectorParts := parentNode selectorParts , node selectorParts.
+        ] ifFalse:[
+            selectorParts := node selectorParts.
+        ].
+        nSelParts := selectorParts size.
+
+        newParts := best asCollectionOfSubstringsSeparatedBy:$:.
+        newParts := newParts select:[:part | part size > 0].
+
+        codeView
+            undoableDo:[
+                |newCursorPosition stop|
+
+                numArgs > nSelParts ifTrue:[
+                    stop := selectorParts last stop.
+
+                    "/ append the rest ...
+                    numArgs downTo:nSelParts+1 do:[:idx |
+                        |newPart|
+
+                        newPart := newParts at:idx.
+                        (best endsWith:$:) ifTrue:[
+                            newPart := newPart , ':'
+                        ].
+
+                        (codeView characterAtCharacterPosition:stop) == $: ifFalse:[
+                            newPart := ':' , newPart.
+                        ].
+                        newPart := (codeView characterAtCharacterPosition:stop) asString , newPart.
+
+                        codeView replaceFromCharacterPosition:stop to:stop with:newPart.
+                        newCursorPosition isNil ifTrue:[
+                            newCursorPosition := stop + newPart size.
+                        ]
+                    ]
+                ].
+
+                (nSelParts min:newParts size) downTo:1 do:[:idx |
+                    |newPart oldPartialToken start stop|
+
+                    newPart := newParts at:idx.
+                    oldPartialToken := selectorParts at:idx.
+                    start := oldPartialToken start.
+                    stop := oldPartialToken stop.
+
+                    (best endsWith:$:) ifTrue:[
+                        (codeView characterAtCharacterPosition:stop+1) == $: ifFalse:[
+                            newPart := newPart , ':'
+                        ]
+                    ] ifFalse:[
+                        (codeView characterAtCharacterPosition:stop) == $: ifTrue:[
+                            newPart := newPart , ':'
+                        ] ifFalse:[
+                            (codeView characterAtCharacterPosition:stop+1) isSeparator ifFalse:[
+                                newPart := newPart , ' '
+                            ]
+                        ]
+"/                            codeView replaceFromCharacterPosition:start to:stop with:(newPart , ':').
+"/                        ] ifFalse:[
+"/                            codeView replaceFromCharacterPosition:start to:stop with:newPart.
+                    ].
+
+                    codeView replaceFromCharacterPosition:start to:stop with:newPart.
+
+                    oldLen := stop - start + 1.
+                    newLen := newPart size.
+
+"/                     codeView selectFromCharacterPosition:start+oldLen to:start+newLen-1.
+                    newCursorPosition isNil ifTrue:[
+                        newCursorPosition := stop + (newLen-oldLen).
+                    ].
+                ].
+                codeView cursorToCharacterPosition:newCursorPosition.
+                codeView cursorRight.  "/ avoid going to the next line !!
+                codeView dontReplaceSelectionOnInput.
+            ]
+        info:'Completion'.
+    ].
+
+    "Created: / 10-11-2006 / 13:18:27 / cg"
+    "Modified: / 16-02-2010 / 10:33:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!DoWhatIMeanSupport class methodsFor:'code completion-helpers'!
+
+codeCompletionForMethod:node inClass:cls codeView:codeView
+    "completion in a methods selector pattern"
+
+    |crsrPos
+     selectorSoFar matchingSelectors
+     selectors distances best rest 
+     allExistingMethods namesOfArguments 
+     nameBag namesByCount|  
+
+    crsrPos := codeView characterPositionOfCursor - 1.
+
+    selectorSoFar := ''.
+    node selectorParts doWithIndex:[:partToken :argNr|
+        |part|
+
+        part := partToken value.
+        selectorSoFar := selectorSoFar , part.
+
+        (crsrPos >= partToken start
+        and:[crsrPos <= partToken stop]) ifTrue:[
+            matchingSelectors := Smalltalk allClasses
+                                    inject:(Set new)
+                                    into:[:theSet :eachClass |
+                                        |md|
+
+                                        cls isMeta ifTrue:[
+                                            md := eachClass theMetaclass methodDictionary
+                                        ] ifFalse:[
+                                            md := eachClass theNonMetaclass methodDictionary
+                                        ].
+                                        theSet addAll:(md keys select:[:sel |sel startsWith:selectorSoFar]).
+                                        theSet.
+                                    ].
+            selectors := matchingSelectors asOrderedCollection.
+            "/ if there is only one, and user has already entered it, he might want to complete the argument-name    
+            (selectors size == 1 
+            and:[selectors first = selectorSoFar]) ifTrue:[
+                allExistingMethods := (Smalltalk allImplementorsOf:selectorSoFar asSymbol)
+                                            collect:[:cls | cls compiledMethodAt:selectorSoFar asSymbol].
+                namesOfArguments := allExistingMethods collect:[:eachMethod | eachMethod methodArgNames].
+                nameBag := Bag new.
+                namesOfArguments do:[:eachNameVector | nameBag add:(eachNameVector at:argNr)].
+                namesByCount := nameBag valuesAndCounts sort:[:a :b | a value < b value].   
+                "/ take the one which occurs most often     
+                best := self askUserForCompletion:'argument' for:codeView at: node start from:(namesByCount collect:[:a | a key]).
+
+                codeView
+                    undoableDo:[
+                        (crsrPos+1) >= codeView contents size ifTrue:[
+                            codeView paste:best.
+                        ] ifFalse:[
+                            codeView insertString:best atCharacterPosition:crsrPos+1.
+                        ]
+                    ]
+                    info:'completion'.
+                codeView cursorToCharacterPosition:(crsrPos + best size - 1).    
+            ] ifFalse:[
+                distances := selectors collect:[:each | each spellAgainst:selectorSoFar].
+                distances sortWith:selectors.
+                selectors reverse.
+                best := self askUserForCompletion:'selector' for:codeView at: node start from:selectors.
+                best isNil ifTrue:[^ self].
+
+                rest := best copyFrom:selectorSoFar size.
+
+                codeView
+                    undoableDo:[ 
+                        codeView 
+                            replaceFromCharacterPosition:crsrPos 
+                            to:crsrPos 
+                            with:rest 
+                    ]
+                    info:'Completion'.
+                codeView cursorToCharacterPosition:(crsrPos + rest size - 1).    
+            ].
+            codeView cursorRight. "/ kludge to make it visible   
+        ].
+    ].
+
+    "Modified: / 04-07-2006 / 18:48:26 / fm"
+    "Created: / 10-11-2006 / 13:46:44 / cg"
+    "Modified: / 16-02-2010 / 10:13:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!DoWhatIMeanSupport class methodsFor:'input completion support'!
+
+methodProtocolCompletion:aPartialProtocolName inEnvironment:anEnvironment
+    "given a partial method protocol name, return an array consisting of
+     2 entries: 1st: the best (longest) match 
+                2nd: collection consisting of matching protocols"
+
+    |matches best lcName|
+
+    matches := IdentitySet new.
+
+    "/ search for exact match
+    anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
+        |protocol|
+
+        protocol := eachMethod category.
+        (protocol notNil and:[protocol startsWith:aPartialProtocolName]) ifTrue:[
+            matches add:protocol
+        ].
+    ].
+    matches isEmpty ifTrue:[
+        "/ search for case-ignoring match
+        lcName := aPartialProtocolName asLowercase.
+        anEnvironment allMethodsWithSelectorDo:[:eachMethod :eachSelector |
+            |protocol|
+
+            protocol := eachMethod category.
+            (protocol notNil and:[protocol asLowercase startsWith:lcName]) ifTrue:[
+                matches add:protocol
+            ].
+        ].
+    ].
+
+    matches isEmpty ifTrue:[
+        ^ Array with:aPartialProtocolName with:(Array with:aPartialProtocolName)
+    ].
+    matches size == 1 ifTrue:[
+        ^ Array with:matches first with:(matches asArray)
+    ].
+    matches := matches asSortedCollection.
+    best := matches longestCommonPrefix.
+    ^ Array with:best with:matches asArray
+
+    "
+     Smalltalk methodProtocolCompletion:'doc'
+     Smalltalk methodProtocolCompletion:'docu' 
+     Smalltalk methodProtocolCompletion:'documenta' 
+    "
+
+    "Created: / 10-08-2006 / 13:05:27 / cg"
+    "Modified: / 16-03-2011 / 12:30:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!DoWhatIMeanSupport class methodsFor:'code completion-helpers'!
+
+old_askUserForCompletion:what for:codeView from:allTheBest
+    |list resources choice lastChoice|
+
+    allTheBest isEmpty ifTrue:[ ^ nil ].
+    allTheBest size == 1 ifTrue:[ ^ allTheBest first ].
+
+    list := allTheBest.
+    LastChoices notNil ifTrue:[
+        lastChoice := LastChoices at:what ifAbsent:nil.
+        lastChoice notNil ifTrue:[
+            list := {lastChoice. nil. } , (list copyWithout:lastChoice).
+        ].
+    ].
+
+    list size < 30 ifTrue:[
+        |menu idx exitKey|
+
+        menu := PopUpMenu labels:list.
+        menu hideOnKeyFilter:[:key | |hide|
+                hide := ( #( CursorDown CursorUp Escape Return ) includes: key) not.
+                hide ifTrue:[
+                    exitKey := key.
+                ].
+                hide].
+
+        idx := menu startUp.
+        idx == 0 ifTrue:[
+            exitKey notNil ifTrue:[
+                codeView keyPress:exitKey x:0 y:0.
+            ].
+            ^ nil
+        ].
+        choice := list at:idx.
+    ] ifFalse:[
+        resources := codeView application isNil 
+                        ifTrue:[ codeView resources]
+                        ifFalse:[ codeView application resources ].
+                    
+        choice := Dialog
+           choose:(resources string:'Choose ',what)
+           fromList:list
+           lines:20
+           title:(resources string:'Code completion').
+        choice isNil ifTrue:[^ nil].
+    ].
+
+    LastChoices isNil ifTrue:[
+        LastChoices := Dictionary new.
+    ].
+    LastChoices at:what put:choice.
+    ^ choice
+
+    "Created: / 16-02-2010 / 09:38:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!EditTextView methodsFor:'accessing-dimensions'!
+
+absoluteXOfPosition:positionInText 
+    |accumulatedX container|
+
+    accumulatedX := 0.
+    container := self.
+    [ container notNil ] whileTrue:[
+        accumulatedX := accumulatedX + container origin x.
+        container := container isTopView ifFalse:[
+                    container container
+                ] ifTrue:[ nil ].
+    ].
+    ^ (self xOfPosition:positionInText) + accumulatedX
+
+    "Created: / 16-02-2010 / 10:05:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!EditTextView methodsFor:'accessing-dimensions'!
+
+absoluteYOfCursor
+
+    | accumulatedY container |
+    accumulatedY := 0.
+    container := self.
+    [ container notNil ] whileTrue:[
+        accumulatedY := accumulatedY + container origin y.
+        container := container isTopView 
+            ifFalse:[container container]
+            ifTrue:[nil].
+    ].
+    ^(self yOfCursor) + accumulatedY
+
+    "Created: / 27-05-2005 / 07:45:53 / janfrog"
+    "Modified: / 27-05-2005 / 23:03:40 / janfrog"
+! !
+
+!EditTextView methodsFor:'accessing-dimensions'!
+
+xOfPosition: positionInText
+
+    | line col |
+    line := self lineOfCharacterPosition: positionInText.
+    col  := positionInText - (self characterPositionOfLine:line col:1) + 1.
+    ^
+        (self xOfCol:col inVisibleLine:(self listLineToVisibleLine: line))
+            - viewOrigin x.
+
+    "Created: / 16-02-2010 / 10:04:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!EditTextView methodsFor:'accessing-dimensions'!
+
+yOfCursor
+
+    ^self yOfVisibleLine:cursorVisibleLine.
+
+    "Created: / 27-05-2005 / 07:43:41 / janfrog"
+! !
+
+!EditTextView methodsFor:'accessing-dimensions'!
+
+yOfPosition: positionInText
+
+    | line |
+    line := self lineOfCharacterPosition: positionInText.
+    ^self yOfVisibleLine:(self listLineToVisibleLine: line)
+
+    "Created: / 16-02-2010 / 10:08:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !ExecutableFunction methodsFor:'printing & storing'!
 
 printStringForBrowserWithSelector:selector
@@ -166,6 +1003,285 @@
     ^ ImageInspectorView
 ! !
 
+!GenericToolbarIconLibrary class methodsFor:'image specs-22x22'!
+
+bookmarks22x22
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self bookmarks22x22 inspect
+     ImageEditor openOnClass:self andSelector:#bookmarks22x22
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:'GenericToolbarIconLibrary class bookmarks22x22'
+        ifAbsentPut:[(Depth8Image new) width: 22; height: 22; photometric:(#palette); bitsPerSample:(#[8]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+????????????????????????????????????????????????????????????????????????LT;??????????????????????????6BAD/??????????????
+?????????16L''"+???????????????????????<7''95Y????????????????????????YI2[_!!C?????????????????????GXZZ&Y\0????????????I$YF
+Q$YFQUBX%)VRZ%YAO34=OR????=T#9RT$9FP#(6K"(VB_718]U0%????FC)9"X"G!!HN@_W]4\V=)YT@E????????J&Y;^''Y3\''A-ZFI_UR8A??????????<Q
+SF9,Z6]#WU!!SQBW??????????????1YWXU9ZTT5IP2K???????????????<)V5IOR$\>NS (????????????????M$-HP#,3KB\ZE07?????????????GST<
+MB4$GATNB0(]?????????????142J18[@O<RC0XCD?????????????<!!H1$G?????1@T@ $H????????????G2@D?????????14L????????????????????
+?????????????????????????????????????????????0@a') ; colorMapFromArray:#[143 162 38 146 165 38 153 167 24 155 168 21 149 168 39 149 169 39 156 169 21 151 170 40 151 171 40 156 171 30 159 173 22 160 174 20 156 174 34 154 175 41 162 176 20 159 176 32 156 176 41 156 177 41 157 177 41 159 178 37 159 178 38 163 179 26 158 179 42 163 180 27 159 180 42 162 180 35 166 181 20 160 181 40 161 181 39 160 181 42 165 181 28 162 181 37 161 181 40 162 181 38 161 181 41 168 181 23 162 182 36 161 182 41 161 182 43 168 183 20 163 183 35 162 183 41 162 183 42 170 184 22 169 185 20 169 185 23 164 185 38 164 185 40 164 185 42 164 185 43 171 186 24 171 187 21 172 187 22 170 187 29 168 187 35 165 187 44 171 188 19 173 190 19 168 189 44 174 190 21 174 190 22 170 192 37 176 192 20 170 192 38 171 193 33 171 193 38 177 193 21 176 194 19 174 194 26 172 193 47 172 193 48 178 195 20 179 195 21 179 197 19 180 197 20 180 197 21 176 197 38 181 199 19 177 199 46 183 201 20 179 200 50 184 202 19 185 202 21 184 203 18 180 201 50 183 204 21 181 203 37 184 204 27 185 205 18 181 204 45 187 205 19 187 205 21 183 206 27 187 208 18 189 208 20 189 210 17 186 208 51 191 210 20 190 211 17 190 211 19 187 209 53 191 213 17 190 211 43 193 213 19 193 214 17 194 216 16 192 215 38 195 216 20 196 217 25 196 218 18 196 217 28 196 219 17 198 220 18 199 221 17 200 222 23 201 222 28 201 224 17 200 225 16 203 223 33 203 225 20 202 226 16 202 223 51 204 224 38 204 224 41 203 227 16 204 226 26 203 226 47 204 229 16 206 227 34 203 227 53 206 230 21 207 228 39 208 228 43 207 231 26 207 228 60 209 229 48 209 229 51 210 229 52 209 232 33 210 232 39 209 231 58 211 233 46 212 234 52 213 233 63 213 234 56 214 235 59 214 237 41 215 235 62 215 235 64 215 238 49 217 238 55 217 240 46 218 239 61 219 242 53 220 242 59 222 245 56 223 245 62 224 248 57 224 248 58 224 248 64 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]; mask:((Depth1Image new) width: 22; height: 22; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@C@@@C @@G @@G @@G0@@O0@_??8O??8O??0C?? A?>@@?<@@?<@@?>@A?>@A>>@A8_@A0F@@@@@@@@@') ; yourself); yourself]
+
+    "Modified: / 05-05-2011 / 12:45:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!GenericToolbarIconLibrary class methodsFor:'image specs - org.eclipse.debug.ui - obj16'!
+
+brkp_obj
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self brkp_obj inspect
+     ImageEditor openOnClass:self andSelector:#brkp_obj
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:'GenericToolbarIconLibrary class brkp_obj'
+        ifAbsentPut:[(Depth8Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(8)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+D1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1L@@ALSD1LSD1LSD1LS@@@@@@@@D1LSD1LSD0@S@@(C@ LJ@ALSD1LSD1L@@@<ABP,I
+@P<@D1LSD1LS@@@CBADQDP C@ALSD1LSD1L@@ PMCAHD@ @SD1LSD1LS@@LEC 8NAPL@D1LSD1LS@@@O@PXPA0DO@ALSD1LSD1LS@@(C@ LJ@@@SD1LSD1LS
+D0@@@@@@@ALSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LSD1LS@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[255 252 255 46 85 127 38 78 114 54 98 139 108 165 203 107 159 195 131 175 205 130 174 204 130 172 200 152 185 208 169 202 225 180 209 229 83 149 190 90 154 194 115 169 204 144 188 216 145 188 215 152 193 219 89 154 192 255 255 255]; mask:((ImageMask new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@C8@_0A?@G<@_0A?@C8@@@@@@@@@@@@@@b') ; yourself); yourself]
+! !
+
+!GenericToolbarIconLibrary class methodsFor:'image specs - org.eclipse.debug.ui - obj16'!
+
+brkpd_obj
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self brkpd_obj inspect
+     ImageEditor openOnClass:self andSelector:#brkpd_obj
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:'GenericToolbarIconLibrary class brkpd_obj'
+        ifAbsentPut:[(Depth8Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(8)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+B0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,K@@@KB0,KB0,K@@,K@@@@@@@@B0,KB0,KB0@@@@LEA0TC@@,KB0,KB0,@@@LH@@@@
+B@L@B0,KB0,K@@@I@@@@@@@I@@,KB0,KB0@@@P@@@@@@@P@KB0,KB0,K@@$@@@@@@@$@B0,KB0,KB0@DA @@@@XD@@@KB0,KB0,K@@PJ@P(D@@,@B0,KB0,@
+@@@@@@@@@@,K@@,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0,KB0@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@a') ; colorMapFromArray:#[227 235 248 79 80 79 255 255 255 201 201 201 182 182 182 135 135 135 122 122 122 105 105 105 103 103 103 98 98 98 85 85 85 255 255 255]; mask:((ImageMask new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@@@C8@]0A#@DD@X0A7@C8@@@@@@@@@@@@@@b') ; yourself); yourself]
+! !
+
+!GenericToolbarIconLibrary class methodsFor:'image specs-16x16'!
+
+bug16x16Icon
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self bug16x16Icon inspect
+     ImageEditor openOnClass:self andSelector:#bug16x16Icon
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:'GenericToolbarIconLibrary class bug16x16Icon'
+        ifAbsentPut:[(Depth8Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(8)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+???????????????????????????????????????????????????3R/??????????????????O"_???????????????????7=?#J1???????????=???=IBP$
+?_????????????7=W5=_W5?=O/7???????>L?PLC@0LC?_????????7=/4S[7S 8TY/=?VC?????L#L.>JI3I+A%H#[?????GA3_]U*/M3_;BPRLD_????7=
+?_B@M>DE-04>?U/??????2_=HEXYQ7:R<Q_???????4>G2$%Q9QEL?5_??????????<=?\;M??????????????????=-H????????0@a') ; colorMapFromArray:#[205 205 205 227 35 35 106 106 106 98 98 98 135 135 135 163 34 34 101 5 5 124 124 124 48 2 2 227 11 11 173 173 173 218 54 54 241 241 241 235 19 19 225 225 225 219 18 18 245 58 58 214 214 214 249 46 46 90 90 90 254 61 61 36 36 36 176 176 176 233 233 233 114 114 114 255 78 78 212 33 33 230 57 57 61 61 61 94 94 94 76 76 76 19 19 19 255 57 57 161 161 161 83 83 83 217 217 217 249 249 249 255 65 65 139 2 2 27 27 27 169 169 169 253 53 53 210 28 28 251 251 251 154 154 154 117 117 117 195 1 1 245 245 245 145 145 145 218 5 5 230 230 230 69 2 2 181 181 181 11 11 11 141 141 141 249 61 61 205 21 21 165 165 165 157 157 157 241 28 28 223 223 223 109 109 109 2 2 2 245 45 45 146 0 0 69 69 69 137 137 137 140 40 40 188 1 1 206 24 24 219 33 33 255 76 76 249 49 49 249 56 56 236 236 236 121 121 121 248 53 53 171 1 1 111 40 40 237 41 41 178 21 21 205 16 16 129 129 129 163 1 1 155 18 18 85 4 4 243 68 68 73 73 73 45 45 45 202 51 51 241 40 40 86 86 86 114 1 1 210 4 4 246 41 41 148 148 148 189 189 189 209 209 209 210 17 17 158 28 28 213 5 5 205 1 1 53 53 53 217 9 9 69 40 40 187 10 10 255 74 74 218 28 28 146 11 11 65 65 65 232 37 37 101 101 101 196 26 26 245 53 53 188 26 26 213 10 10 184 184 184 206 5 5 249 65 65 172 21 21 206 34 34 195 195 195 237 32 32 131 12 12 233 29 29 179 36 36 241 37 37 139 13 13 245 49 49 180 1 1 168 37 37 198 198 198 202 202 202 228 21 21 206 10 10 206 29 29 229 30 30 255 80 80 188 20 20 245 37 37 57 57 57 252 50 50 87 42 42 172 10 10 209 13 13 155 4 4 164 11 11 242 44 44 255 70 70 225 25 25 222 14 14 237 24 24 240 49 49 205 13 13 202 44 44 201 0 0 225 17 17 186 42 42 255 72 72 122 1 1 40 40 40 157 10 10 209 8 8 222 8 8 195 41 41 223 21 21 180 11 11 255 68 68 162 28 28 194 11 11 232 25 25 131 1 1 241 32 32 246 246 246 49 49 49 224 44 44 208 2 2 227 227 227 239 239 239 239 46 46 162 20 20 245 33 33 219 219 219 238 29 29 237 37 37 171 29 29 36 46 46 250 68 68 147 16 16 182 26 26 187 187 187 24 1 1 185 32 32 229 24 24 232 33 33 150 150 150 122 12 12 229 17 17 204 27 27 242 52 52 213 2 2 200 15 15 191 191 191 217 43 43 217 12 12 115 10 10 140 16 16 200 28 28 202 6 6 215 13 13 182 41 41 57 46 46 40 46 46 233 40 40 252 70 70 173 40 40 226 28 28 46 54 54 202 22 22 203 18 18 245 72 72 191 17 17 200 37 37 10 0 0 50 52 52 252 74 74 252 72 72 247 38 38 160 40 40 231 14 14 252 68 68 200 10 10 15 15 15 211 47 47 254 254 254 253 76 76 23 23 23 237 69 69 7 7 7 144 7 7 196 8 7 32 32 32 59 59 59 90 93 93 67 67 67 70 28 28 50 56 56 232 15 16 208 4 4 237 35 35 220 12 11 232 20 20 223 62 62 0 0 0 255 255 255 255 255 255]; mask:((ImageMask new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@L@@0@C8AO C?0O<C?>G?0??#?>C?0_?@O@@L@b') ; yourself); yourself]
+! !
+
+!GenericToolbarIconLibrary class methodsFor:'image specs-24x24'!
+
+bug24x24Icon
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self bug24x24Icon inspect
+     ImageEditor openOnClass:self andSelector:#bug24x24Icon
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:'GenericToolbarIconLibrary class bug24x24Icon'
+        ifAbsentPut:[(Depth8Image new) width: 24; height: 24; photometric:(#palette); bitsPerSample:(#(8)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+??????????????????????????????????????????????????>6???????????????????????1???????=????????????????????????<4+????=????
+????????????????????O"_???> ??????????????????????????7.?3;.?????????????????????????_4$?#K=,_????????????????7???=/?RP$
+IBP$?_?????=????????MX3=???=L#H2L#H2?_7?XQW.???????????=?_7=W5=_W5=_W?7=O/7?????????????#O4''@0LC@0LC@?7=????????????????
+?_6 PTEAPTEAPSW=?????????????_7=/4R[6=48NC!!"TY-M?_7=XO???????3H0L29%>JK/\2Z",FUDH#YJ????????????L9-$3N>%%ZW/YL!!D????????
+????GA1W77W7V*<7M3\R>0%DAH0\D_???????_7=?_@M C_W8PTP-05MO/7=V???????B!!X4MX>WRW7WFPVZ"?//?1XV??????????<XI?7]HEXYFT]Y_)K=
+<Q_???????????4XO!!?DJRU*Q9P%QSL5?U<-?????????3T5???=F$  EB@?L37?G3;=????????????????O_7D3,7=??????????????????????????<(
+[RO?????????????????????????????????????????????') ; colorMapFromArray:#[205 205 205 227 35 35 106 106 106 98 98 98 135 135 135 163 34 34 101 5 5 124 124 124 48 2 2 227 11 11 173 173 173 218 54 54 241 241 241 235 19 19 225 225 225 219 18 18 245 58 58 214 214 214 249 46 46 90 90 90 254 61 61 36 36 36 176 176 176 233 233 233 114 114 114 255 78 78 212 33 33 230 57 57 61 61 61 94 94 94 76 76 76 19 19 19 255 57 57 161 161 161 83 83 83 217 217 217 249 249 249 255 65 65 139 2 2 27 27 27 169 169 169 253 53 53 210 28 28 251 251 251 154 154 154 117 117 117 195 1 1 245 245 245 145 145 145 218 5 5 230 230 230 69 2 2 181 181 181 11 11 11 141 141 141 249 61 61 205 21 21 165 165 165 157 157 157 241 28 28 223 223 223 109 109 109 2 2 2 245 45 45 146 0 0 69 69 69 137 137 137 140 40 40 188 1 1 206 24 24 219 33 33 255 76 76 249 49 49 249 56 56 236 236 236 121 121 121 248 53 53 171 1 1 111 40 40 237 41 41 178 21 21 205 16 16 129 129 129 163 1 1 155 18 18 85 4 4 243 68 68 73 73 73 45 45 45 202 51 51 241 40 40 86 86 86 114 1 1 210 4 4 246 41 41 148 148 148 189 189 189 209 209 209 210 17 17 158 28 28 213 5 5 205 1 1 53 53 53 217 9 9 69 40 40 187 10 10 255 74 74 218 28 28 146 11 11 65 65 65 232 37 37 101 101 101 196 26 26 245 53 53 188 26 26 213 10 10 184 184 184 206 5 5 249 65 65 172 21 21 206 34 34 195 195 195 237 32 32 131 12 12 233 29 29 179 36 36 241 37 37 139 13 13 245 49 49 180 1 1 168 37 37 198 198 198 202 202 202 228 21 21 206 10 10 206 29 29 229 30 30 255 80 80 188 20 20 245 37 37 57 57 57 252 50 50 87 42 42 172 10 10 209 13 13 155 4 4 164 11 11 242 44 44 255 70 70 225 25 25 222 14 14 237 24 24 240 49 49 205 13 13 202 44 44 201 0 0 225 17 17 186 42 42 255 72 72 122 1 1 40 40 40 157 10 10 209 8 8 222 8 8 195 41 41 223 21 21 180 11 11 255 68 68 162 28 28 194 11 11 232 25 25 131 1 1 241 32 32 246 246 246 49 49 49 224 44 44 208 2 2 227 227 227 239 239 239 239 46 46 162 20 20 245 33 33 219 219 219 238 29 29 237 37 37 171 29 29 36 46 46 250 68 68 147 16 16 182 26 26 187 187 187 24 1 1 185 32 32 229 24 24 232 33 33 150 150 150 122 12 12 229 17 17 204 27 27 242 52 52 213 2 2 200 15 15 191 191 191 217 43 43 217 12 12 115 10 10 140 16 16 200 28 28 202 6 6 215 13 13 182 41 41 57 46 46 40 46 46 233 40 40 252 70 70 173 40 40 226 28 28 46 54 54 202 22 22 203 18 18 245 72 72 191 17 17 200 37 37 10 0 0 50 52 52 252 74 74 252 72 72 247 38 38 160 40 40 231 14 14 252 68 68 200 10 10 15 15 15 211 47 47 254 254 254 253 76 76 23 23 23 237 69 69 7 7 7 144 7 7 196 8 7 32 32 32 59 59 59 90 93 93 67 67 67 70 28 28 50 56 56 232 15 16 208 4 4 237 35 35 220 12 11 232 20 20 223 62 62 0 0 0 255 255 255 255 255 255]; mask:((ImageMask new) width: 24; height: 24; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@H@@HH@@FH@@FH@@CX@@G<@BO<HGO>8A??0@??@@??@G??<C??8@??@G??<G??<G??XA??0C??8CO>8@G8@@A0@@@@@') ; yourself); yourself]
+! !
+
+!GenericToolbarIconLibrary class methodsFor:'image specs-32x32'!
+
+bug32x32Icon
+    <resource: #image>
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+    "
+     self bug3232Icon inspect
+     ImageEditor openOnClass:self andSelector:#bug3232Icon
+     Icon flushCachedIcons"
+    
+    ^ Icon constantNamed:'GenericToolbarIconLibrary class bug3232Icon'
+        ifAbsentPut:[
+            (Depth8Image new)
+                width:32;
+                height:32;
+                photometric:(#palette);
+                bitsPerSample:(#( 8 ));
+                samplesPerPixel:((1));
+                bits:(ByteArray 
+                            fromPackedString:'
+??????????????????????????????????????????????????????????????????>6@/?????????????????????????????1H_????????4-????????
+???????????????????????=?_??????O!!???????????????????????????????3W3R/?????=I????????????????????????????????38''?????:C?
+??????????????????????????????????7.??<>;/???????????????????????????????????_7=?_7=????????????????????????????????[?7=
+IO;>L/7=,_?????????????????????=?????6?=?RP$IBP$IO7=???????=????????????MX3=?????_42L#H2L#H2L/7=??=!!E^8Q????????????O.9K
+?_7=@G%9^W%9^W%9JO7=O%K=O/???????????????_7=?_5_W5=_W5=_W5=_?_7=O/7??????????????????83=I0LC@0LC@0LC@0O=?SK?????????????
+?????????_6 PTEAPTEAPTEAPSW=M_??????????????JC(SI?7= S#WP49(ZF"NS$N$]UO=?QU/@6G???????<-?_7=?[=D&5G[7S 8NC!!"65F[S_7=?_4U
+XO??????????L#C4L29%,O"";7M3I*K8,FUD?RH6R/????????????????<3&6Q''3N>%%YV%;6]$2DS=????????????????????(@#8(92*/KN3,4=T0YZ#
+K/40?????????????0P\GE]X77W7*%*/M3\7M1K9>0%D?PRLGB\Q????????<_7=?S;=<@5> C_W8^DEDC>7CT7=O/7=<U/?????????B!!X4?3VO%59I_]\Y
+FPVZSH/;;8O?E!!Y9????????????????I<SAD#^BFX&IFVMI86H3H/??????????????????FB4''?]5^HEXY"Q%GVR%>$/4^<Q_???????????????4X?S8_
+1DX)IV)GQ9P%D$T3MS;=W27?????????????MST!!???=1A)HHBTTHC?FL37??1<>?_?????????????????????=A''KUO9M.]0# ?????1_?????????????
+??????????<=?\SN3,7=H???????????????????????????????????JFY-H???????????????????????????????????????????????????????????
+?????????????????????????????????????????????0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@');
+                colorMapFromArray:#[ 205 205 205 227 35 35 106 106 106 98 98 98 135 135 135 163 34 34 101 5 5 124 124 124 48 2 2 227 11 11 173 173 173 218 54 54 241 241 241 235 19 19 225 225 225 219 18 18 245 58 58 214 214 214 249 46 46 90 90 90 254 61 61 36 36 36 176 176 176 233 233 233 114 114 114 255 78 78 212 33 33 230 57 57 61 61 61 94 94 94 76 76 76 19 19 19 255 57 57 161 161 161 83 83 83 217 217 217 249 249 249 255 65 65 139 2 2 27 27 27 169 169 169 253 53 53 210 28 28 251 251 251 154 154 154 117 117 117 195 1 1 245 245 245 145 145 145 218 5 5 230 230 230 69 2 2 181 181 181 11 11 11 141 141 141 249 61 61 205 21 21 165 165 165 157 157 157 241 28 28 223 223 223 109 109 109 2 2 2 245 45 45 146 0 0 69 69 69 137 137 137 140 40 40 188 1 1 206 24 24 219 33 33 255 76 76 249 49 49 249 56 56 236 236 236 121 121 121 248 53 53 171 1 1 111 40 40 237 41 41 178 21 21 205 16 16 129 129 129 163 1 1 155 18 18 85 4 4 243 68 68 73 73 73 45 45 45 202 51 51 241 40 40 86 86 86 114 1 1 210 4 4 246 41 41 148 148 148 189 189 189 209 209 209 210 17 17 158 28 28 213 5 5 205 1 1 53 53 53 217 9 9 69 40 40 187 10 10 255 74 74 218 28 28 146 11 11 65 65 65 232 37 37 101 101 101 196 26 26 245 53 53 188 26 26 213 10 10 184 184 184 206 5 5 249 65 65 172 21 21 206 34 34 195 195 195 237 32 32 131 12 12 233 29 29 179 36 36 241 37 37 139 13 13 245 49 49 180 1 1 168 37 37 198 198 198 202 202 202 228 21 21 206 10 10 206 29 29 229 30 30 255 80 80 188 20 20 245 37 37 57 57 57 252 50 50 87 42 42 172 10 10 209 13 13 155 4 4 164 11 11 242 44 44 255 70 70 225 25 25 222 14 14 237 24 24 240 49 49 205 13 13 202 44 44 201 0 0 225 17 17 186 42 42 255 72 72 122 1 1 40 40 40 157 10 10 209 8 8 222 8 8 195 41 41 223 21 21 180 11 11 255 68 68 162 28 28 194 11 11 232 25 25 131 1 1 241 32 32 246 246 246 49 49 49 224 44 44 208 2 2 227 227 227 239 239 239 239 46 46 162 20 20 245 33 33 219 219 219 238 29 29 237 37 37 171 29 29 36 46 46 250 68 68 147 16 16 182 26 26 187 187 187 24 1 1 185 32 32 229 24 24 232 33 33 150 150 150 122 12 12 229 17 17 204 27 27 242 52 52 213 2 2 200 15 15 191 191 191 217 43 43 217 12 12 115 10 10 140 16 16 200 28 28 202 6 6 215 13 13 182 41 41 57 46 46 40 46 46 233 40 40 252 70 70 173 40 40 226 28 28 46 54 54 202 22 22 203 18 18 245 72 72 191 17 17 200 37 37 10 0 0 50 52 52 252 74 74 252 72 72 247 38 38 160 40 40 231 14 14 252 68 68 200 10 10 15 15 15 211 47 47 254 254 254 253 76 76 23 23 23 237 69 69 7 7 7 144 7 7 196 8 7 32 32 32 59 59 59 90 93 93 67 67 67 70 28 28 50 56 56 232 15 16 208 4 4 237 35 35 220 12 11 232 20 20 223 62 62 0 0 0 255 255 255 255 255 255 ];
+                mask:((ImageMask new)
+                            width:32;
+                            height:32;
+                            photometric:(#blackIs0);
+                            bitsPerSample:(#[ 1 ]);
+                            samplesPerPixel:((1));
+                            bits:(ByteArray 
+                                        fromPackedString:'
+@@@@@@@@L@@@LC@@@A 0@@@\L@@@CB@@@@Y @@@G8@@@G? @AC?8H@8??O@G??? @???0@C??0@@??<@G???>A???? G??? @O??@@G??8@_???8G???>@;?
+?7@@??<@@???0@_??>@GO?3 @A?8P@@O<@@@@<@@@@@@@@@@@@@b');
+                            yourself);
+                yourself
+        ]
+! !
+
+!GenericToolbarIconLibrary class methodsFor:'image specs-16x16'!
+
+lint16x16Icon
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self lint16x16Icon inspect
+     ImageEditor openOnClass:self andSelector:#lint16x16Icon
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:'GenericToolbarIconLibrary class lint16x16Icon'
+        ifAbsentPut:[(Depth8Image new) width: 16; height: 16; photometric:(#palette); bitsPerSample:(#(8)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+??????????????????????????????????????????????????<4[_??????????????????A4W??????????????????2<A()BG??????????<A??<A1_;>
+@XS??????????3<)-;^76.Z5A0O???????<P@W!!8>-3J<0+??????0\JI1,;7^?57-[;''T????<JS0P"PN3'':-V>8L??????V5@''G57.1,!!#X-''R_O???1(R
+@RMW:Y*KY6+7*RW??????3P*ZU[;.:#!!/:7???????<A@6AV2?S:9+>5??????????< BC &?????;?Z??????????<XU_?????X<P@a') ; colorMapFromArray:#[0 1 0 0 2 0 1 4 0 3 6 2 30 1 0 6 9 5 34 2 2 10 12 8 43 4 2 13 15 12 15 17 13 77 0 0 16 18 15 35 14 12 17 19 16 67 6 1 19 20 18 75 7 10 21 23 20 86 9 4 25 27 24 111 4 7 103 7 10 96 10 12 32 29 28 29 30 28 31 33 30 153 2 0 33 35 33 35 36 34 110 16 16 173 0 1 36 38 35 41 37 36 165 4 0 155 7 7 128 15 14 39 41 39 157 12 16 51 42 42 207 0 4 43 45 42 58 41 39 141 19 15 199 4 0 210 3 0 221 1 4 48 49 47 231 0 12 211 7 8 172 19 10 172 19 18 52 54 51 53 55 53 234 5 23 59 54 53 176 24 21 56 57 55 57 59 56 204 19 22 195 22 24 103 47 48 227 16 9 60 61 59 198 25 19 216 20 21 61 63 60 119 48 45 228 20 20 63 65 62 211 30 27 68 69 67 69 71 68 212 32 34 242 25 29 72 74 71 74 76 74 191 45 50 245 31 38 76 78 75 77 79 76 79 80 78 138 66 66 248 36 40 240 41 43 83 85 82 216 50 52 241 43 50 195 58 61 86 88 85 244 46 46 87 89 86 89 91 88 214 58 58 193 65 67 92 93 91 248 51 49 109 90 87 185 68 87 194 67 80 87 95 125 250 54 57 173 74 96 202 67 84 159 78 103 253 56 52 188 72 90 87 99 135 129 89 121 99 101 98 73 104 148 255 59 60 159 83 106 175 81 94 94 102 132 187 78 98 215 71 85 255 61 67 169 84 104 251 66 66 104 106 103 90 106 147 151 92 119 200 81 93 107 108 106 140 99 131 162 94 119 255 72 76 144 100 128 96 112 153 228 80 83 159 97 120 111 113 110 191 90 111 206 87 104 113 115 112 87 118 163 115 117 114 83 122 166 179 100 117 118 120 117 199 99 101 231 91 88 138 113 147 120 122 119 196 101 119 123 125 122 115 123 167 213 100 113 119 123 162 180 109 128 127 129 126 208 108 109 115 131 173 185 115 140 158 122 154 173 119 144 131 133 130 130 130 163 178 122 124 181 119 147 106 139 178 136 138 135 120 139 175 126 138 175 204 121 132 132 139 172 113 146 186 136 143 176 144 146 143 121 149 184 153 142 173 135 150 181 148 150 147 125 153 188 130 153 182 179 140 167 150 152 149 205 136 148 181 145 146 136 159 189 155 157 154 140 163 193 159 161 158 161 163 160 143 166 196 162 164 161 148 167 192 164 166 163 165 165 187 197 159 173 167 169 166 152 171 196 191 163 180 157 172 191 169 171 168 216 159 166 171 173 170 208 163 179 187 169 190 217 162 175 174 176 173 159 178 203 186 173 174 207 167 175 163 178 198 213 166 176 179 181 178 198 176 192 169 185 204 183 185 182 216 175 184 209 177 189 212 180 192 204 183 198 208 183 193 188 190 187 180 192 206 194 196 193 215 191 201 187 199 213 204 198 197 211 196 210 199 201 198 190 202 216 191 203 217 201 202 212 202 204 201 208 203 201 219 201 210 205 207 203 217 203 217 206 208 205 213 207 206 223 205 214 203 211 220 211 213 210 211 212 222 214 216 213 221 215 227 217 219 216 219 221 218 228 218 224 217 222 225 221 223 220 231 221 227 216 225 233 220 226 228 224 226 223 221 229 238 231 233 230 228 234 236 233 235 232 235 238 234 249 251 248 255 255 255]; mask:((ImageMask new) width: 16; height: 16; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@L@@0@C8AO0C?0O>C?>O?0??#?>C?0O?@OC@LLb') ; yourself); yourself]
+! !
+
+!GenericToolbarIconLibrary class methodsFor:'image specs-24x24'!
+
+lint24x24Icon
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self lint24x24Icon inspect
+     ImageEditor openOnClass:self andSelector:#lint24x24Icon
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:'GenericToolbarIconLibrary class lint24x24Icon'
+        ifAbsentPut:[(Depth8Image new) width: 24; height: 24; photometric:(#palette); bitsPerSample:(#(8)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+??????????????????????????????????????????????????????????????????????????=_W?????< @???????????????????????MF7???<4????
+????????????????????A4W???<L?????????????????????????2AG?4HY????????????????????????K0E[()@J!!????????????????0G?????@\W>
+?/;0@XS???<Z????????JUEK??</0?3<?O3<F G??0)H??????????<GO2$A-;^7-=+,9+T]A0MU????????????D@DG^G!!<>-262/O1B/??????????????
+@PDPR4/I):+J+8+Q,_??????????A0(]I1,,N=7J;?W27-ZO>94NS???????B$=QABH(PN2#9>+%5[:@8L>D????????????A!!<-S_BU6=/W3)Y:.]??????
+????V5AEI1<>W^:$1,"2X6I(6]IP_O??????F!!HN@RL0U>&6&(-1Y6)(=:$RI_??????N%%\@1UDXKO;(HM6^7M,<G!!Y#O??????????MB(2ZUZX>;.&*NG:
+/:6D??????????<)@PLSXEY?2?S<>.Y-/;V-?????????1$A??<GRU)/]8JMT"_?/;>5#O??????????????H@ +NBXQ??????>:/=*L??????????????<9
+FEU_????????6OF5????????????????????????????-]K?') ; colorMapFromArray:#[0 1 0 0 2 0 1 4 0 3 6 2 30 1 0 6 9 5 34 2 2 10 12 8 43 4 2 13 15 12 15 17 13 77 0 0 16 18 15 35 14 12 17 19 16 67 6 1 19 20 18 75 7 10 21 23 20 86 9 4 25 27 24 111 4 7 103 7 10 96 10 12 32 29 28 29 30 28 31 33 30 153 2 0 33 35 33 35 36 34 110 16 16 173 0 1 36 38 35 41 37 36 165 4 0 155 7 7 128 15 14 39 41 39 157 12 16 51 42 42 207 0 4 43 45 42 58 41 39 141 19 15 199 4 0 210 3 0 221 1 4 48 49 47 231 0 12 211 7 8 172 19 10 172 19 18 52 54 51 53 55 53 234 5 23 59 54 53 176 24 21 56 57 55 57 59 56 204 19 22 195 22 24 103 47 48 227 16 9 60 61 59 198 25 19 216 20 21 61 63 60 119 48 45 228 20 20 63 65 62 211 30 27 68 69 67 69 71 68 212 32 34 242 25 29 72 74 71 74 76 74 191 45 50 245 31 38 76 78 75 77 79 76 79 80 78 138 66 66 248 36 40 240 41 43 83 85 82 216 50 52 241 43 50 195 58 61 86 88 85 244 46 46 87 89 86 89 91 88 214 58 58 193 65 67 92 93 91 248 51 49 109 90 87 185 68 87 194 67 80 87 95 125 250 54 57 173 74 96 202 67 84 159 78 103 253 56 52 188 72 90 87 99 135 129 89 121 99 101 98 73 104 148 255 59 60 159 83 106 175 81 94 94 102 132 187 78 98 215 71 85 255 61 67 169 84 104 251 66 66 104 106 103 90 106 147 151 92 119 200 81 93 107 108 106 140 99 131 162 94 119 255 72 76 144 100 128 96 112 153 228 80 83 159 97 120 111 113 110 191 90 111 206 87 104 113 115 112 87 118 163 115 117 114 83 122 166 179 100 117 118 120 117 199 99 101 231 91 88 138 113 147 120 122 119 196 101 119 123 125 122 115 123 167 213 100 113 119 123 162 180 109 128 127 129 126 208 108 109 115 131 173 185 115 140 158 122 154 173 119 144 131 133 130 130 130 163 178 122 124 181 119 147 106 139 178 136 138 135 120 139 175 126 138 175 204 121 132 132 139 172 113 146 186 136 143 176 144 146 143 121 149 184 153 142 173 135 150 181 148 150 147 125 153 188 130 153 182 179 140 167 150 152 149 205 136 148 181 145 146 136 159 189 155 157 154 140 163 193 159 161 158 161 163 160 143 166 196 162 164 161 148 167 192 164 166 163 165 165 187 197 159 173 167 169 166 152 171 196 191 163 180 157 172 191 169 171 168 216 159 166 171 173 170 208 163 179 187 169 190 217 162 175 174 176 173 159 178 203 186 173 174 207 167 175 163 178 198 213 166 176 179 181 178 198 176 192 169 185 204 183 185 182 216 175 184 209 177 189 212 180 192 204 183 198 208 183 193 188 190 187 180 192 206 194 196 193 215 191 201 187 199 213 204 198 197 211 196 210 199 201 198 190 202 216 191 203 217 201 202 212 202 204 201 208 203 201 219 201 210 205 207 203 217 203 217 206 208 205 213 207 206 223 205 214 203 211 220 211 213 210 211 212 222 214 216 213 221 215 227 217 219 216 219 221 218 228 218 224 217 222 225 221 223 220 231 221 227 216 225 233 220 226 228 224 226 223 221 229 238 231 233 230 228 234 236 233 235 232 235 238 234 249 251 248 255 255 255]; mask:((ImageMask new) width: 24; height: 24; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'@@@@@@@@@LL@@FH@@FH@@CX@@G<@BG>HGO>XA??8@?? @?? G??<G??8@??0G??<G??<G??<@??8A??8CO><@G8O@A8G@@@F') ; yourself); yourself]
+! !
+
+!GenericToolbarIconLibrary class methodsFor:'image specs-32x32'!
+
+lint32x32Icon
+    "This resource specification was automatically generated
+     by the ImageEditor of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the ImageEditor may not be able to read the specification."
+
+    "
+     self lint32x32Icon inspect
+     ImageEditor openOnClass:self andSelector:#lint32x32Icon
+     Icon flushCachedIcons
+    "
+
+    <resource: #image>
+
+    ^Icon
+        constantNamed:'GenericToolbarIconLibrary class lint32x32Icon'
+        ifAbsentPut:[(Depth8Image new) width: 32; height: 32; photometric:(#palette); bitsPerSample:(#(8)); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+????????????????????????????????????????????????????????????????????!!O????????????????????????????=_JU???????2@4@???????
+??????????????????????<AT_??????@Q*??????????????????????????????4H4[_????<4O????????????????????????????????0]E?????01K
+?????????????????????????????????2AG??=BFX_?????????????????????????????????QQ$A@PDR?????????????????????????????????2<A
+V96"$@(C!!?????????????????????<A??????<R@\W>?/;><CPA!!O????<Z????????????JUEK????K0GC?O3<?O3<>A(A????B$"G????????????@SQG
+V0(ARNO#8>O#8>O_+PD9NS(%@P_?????????????A0\?JPFW-;^7-;_Z;OG&-Q5EA0MU????????????????QQ@AA718^G2?>-26+,+3<W0J????????????
+????????@PDPR4-K2_^''*,+M+8+Q>+G??????????????4IHUV4)B19COVG:(\K9=.7"/XGY;E=HQZ''???????=\A0(]P"\[KC,;7\*+;?W2:-;V#8#;''P8%
+S?????????<JS5D)ABH(LTC,(<_'':.W[5[:@^^CO!!@G???????????????<FG241S_BU4M/[5=ON%'')2.]???????????????????0P_K"9^=IOA5MOL1JU&
+\FR47?????????????=[TDT:I1<>M%7.)KCF2KJTX6I(Z=''RTD-<????????EA(RC DAH3AJU>&6&9*K\WQ''Z&!!.=:$RMBW?????????N%%\C LUQD9 ,?.Y
+(HM6!!''-3[LC0^E%_#O??????????????!!@=AS&UX9N.Y''G:Q!!W6,?]"L?????????????????4,4J#INZUZX9/.;)):(8_+0/:6D??????????????<)GPDC
+D4Y U''>N2?S<?_+&[\N?-Z6I????????????FPD)??<GE$%Z[7U7 (6_T"_??;>?-Z6L????????????Q?????<AE31TXFAZRRPM?????;2<.J6R????????
+??????????< BB,3NBXQM????????;*</=*L????????????????????NRDXUU???????????;#X<[W??????????????????????????????????????;WR
+?????????????????????????????????????????????0@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@@@@@@@@@@@@') ; colorMapFromArray:#[0 1 0 0 2 0 1 4 0 3 6 2 30 1 0 6 9 5 34 2 2 10 12 8 43 4 2 13 15 12 15 17 13 77 0 0 16 18 15 35 14 12 17 19 16 67 6 1 19 20 18 75 7 10 21 23 20 86 9 4 25 27 24 111 4 7 103 7 10 96 10 12 32 29 28 29 30 28 31 33 30 153 2 0 33 35 33 35 36 34 110 16 16 173 0 1 36 38 35 41 37 36 165 4 0 155 7 7 128 15 14 39 41 39 157 12 16 51 42 42 207 0 4 43 45 42 58 41 39 141 19 15 199 4 0 210 3 0 221 1 4 48 49 47 231 0 12 211 7 8 172 19 10 172 19 18 52 54 51 53 55 53 234 5 23 59 54 53 176 24 21 56 57 55 57 59 56 204 19 22 195 22 24 103 47 48 227 16 9 60 61 59 198 25 19 216 20 21 61 63 60 119 48 45 228 20 20 63 65 62 211 30 27 68 69 67 69 71 68 212 32 34 242 25 29 72 74 71 74 76 74 191 45 50 245 31 38 76 78 75 77 79 76 79 80 78 138 66 66 248 36 40 240 41 43 83 85 82 216 50 52 241 43 50 195 58 61 86 88 85 244 46 46 87 89 86 89 91 88 214 58 58 193 65 67 92 93 91 248 51 49 109 90 87 185 68 87 194 67 80 87 95 125 250 54 57 173 74 96 202 67 84 159 78 103 253 56 52 188 72 90 87 99 135 129 89 121 99 101 98 73 104 148 255 59 60 159 83 106 175 81 94 94 102 132 187 78 98 215 71 85 255 61 67 169 84 104 251 66 66 104 106 103 90 106 147 151 92 119 200 81 93 107 108 106 140 99 131 162 94 119 255 72 76 144 100 128 96 112 153 228 80 83 159 97 120 111 113 110 191 90 111 206 87 104 113 115 112 87 118 163 115 117 114 83 122 166 179 100 117 118 120 117 199 99 101 231 91 88 138 113 147 120 122 119 196 101 119 123 125 122 115 123 167 213 100 113 119 123 162 180 109 128 127 129 126 208 108 109 115 131 173 185 115 140 158 122 154 173 119 144 131 133 130 130 130 163 178 122 124 181 119 147 106 139 178 136 138 135 120 139 175 126 138 175 204 121 132 132 139 172 113 146 186 136 143 176 144 146 143 121 149 184 153 142 173 135 150 181 148 150 147 125 153 188 130 153 182 179 140 167 150 152 149 205 136 148 181 145 146 136 159 189 155 157 154 140 163 193 159 161 158 161 163 160 143 166 196 162 164 161 148 167 192 164 166 163 165 165 187 197 159 173 167 169 166 152 171 196 191 163 180 157 172 191 169 171 168 216 159 166 171 173 170 208 163 179 187 169 190 217 162 175 174 176 173 159 178 203 186 173 174 207 167 175 163 178 198 213 166 176 179 181 178 198 176 192 169 185 204 183 185 182 216 175 184 209 177 189 212 180 192 204 183 198 208 183 193 188 190 187 180 192 206 194 196 193 215 191 201 187 199 213 204 198 197 211 196 210 199 201 198 190 202 216 191 203 217 201 202 212 202 204 201 208 203 201 219 201 210 205 207 203 217 203 217 206 208 205 213 207 206 223 205 214 203 211 220 211 213 210 211 212 222 214 216 213 221 215 227 217 219 216 219 221 218 228 218 224 217 222 225 221 223 220 231 221 227 216 225 233 220 226 228 224 226 223 221 229 238 231 233 230 228 234 236 233 235 232 235 238 234 249 251 248 255 255 255]; mask:((ImageMask new) width: 32; height: 32; photometric:(#blackIs0); bitsPerSample:(#[1]); samplesPerPixel:(1); bits:(ByteArray fromPackedString:'
+@@@@@@@@D@@@NC @@A 8@@@\L@@@CC@@@@Y0@@@G8@@@C? @AA?<H@8??G@G???0@???8@G??8@@??>@C???>A???? O???0@O??0@C??<@O???8G???>@??
+?? @???@@_??8@O???@GO?38@!!?8_@@O<C8@@>@^@@@@C@@@@@@b') ; yourself); yourself]
+! !
+
 !Image methodsFor:'inspecting'!
 
 inspectorClass
@@ -200,6 +1316,14 @@
     "Modified: / 06-10-2006 / 13:57:28 / cg"
 ! !
 
+!MenuView methodsFor:'accessing-behavior'!
+
+shortKeys
+    ^ shortKeys
+
+    "Created: / 18-10-2008 / 19:16:59 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
 !Method methodsFor:'inspecting'!
 
 inspectorExtraAttributes
@@ -225,13 +1349,21 @@
     "return a printString to represent myself to the user in a browser.
      Defined here to allow for browsers to deal with nonStandard pseudoMethods"
 
-    |s privInfo moreInfo p info n cls currentChangeSet isInChangeSet mthdPackage
+    |s privInfo moreInfo p info n cls ns currentChangeSet isInChangeSet mthdPackage
      userPreferences shownSelector suppressPackage timeRounded|
 
     moreInfo := ''.
     privInfo := ''.
     userPreferences := UserPreferences current.
 
+    ns := self nameSpace.
+    (ns notNil and:[ns isNameSpace]) ifTrue:[
+        moreInfo := moreInfo , 
+            ((' < %1 >' bindWith: ns name) asText emphasisAllAdd:
+                userPreferences emphasisForNamespacedCode)
+
+    ].
+
     self isWrapped ifTrue:[
         (MessageTracer isCounting:self) ifTrue:[
             (MessageTracer isCountingMemoryUsage:self) ifTrue:[
@@ -334,6 +1466,7 @@
     "Modified: / 23-01-1998 / 13:15:15 / stefan"
     "Created: / 05-02-2000 / 22:55:56 / cg"
     "Modified: / 05-03-2007 / 16:18:53 / cg"
+    "Modified: / 20-07-2010 / 15:39:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !Method methodsFor:'printing & storing'!
@@ -350,10 +1483,14 @@
     selector isNameSpaceSelector ifFalse:[^ selector].
 
     idx := selector indexOf:$: startingAt:3.
+    "
     nsPart := selector copyFrom:2 to:idx-1.
     ns := Smalltalk at:nsPart asSymbol.
+    "
     selPart := selector copyFrom:idx+2.
-    ^ selPart , ' {',nsPart,'}'.
+    ^ selPart ", ' {',nsPart,'}'."
+
+    "Modified: / 20-07-2010 / 10:33:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !MethodDictionary methodsFor:'inspecting'!
@@ -380,6 +1517,57 @@
 
 ! !
 
+!Object methodsFor:'converting'!
+
+asTestCase
+
+    ^self
+
+    "Created: / 04-03-2011 / 08:19:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Object methodsFor:'debugging'!
+
+inspect
+    "{ Pragma: +optSpace }"
+
+    "launch an inspector on the receiver.
+     this method (or better: inspectorClass) can be redefined in subclasses
+     to start special inspectors."
+
+    |cls|
+
+    cls := (Smalltalk classNamed: #'Tools::Inspector2') 
+                ifNil:[self inspectorClass].
+
+    cls isNil ifTrue:[
+        ^ self basicInspect
+    ].
+    cls openOn:self
+
+    "
+     Object new inspect
+     (1 @ 2) inspect
+     Smalltalk inspect
+     #(1 2 3) asOrderedCollection inspect
+     (Color red) inspect
+     (Image fromFile:'bitmaps/garfield.gif') inspect
+    "
+! !
+
+!Object methodsFor:'debugging'!
+
+inspector2TabCommon
+
+    ^(Tools::Inspector2Tab new
+            priority: 50;
+            label:'Object';
+            view: ((self inspectorClass new inspect:self)
+                        yourself))
+
+    "Created: / 24-05-2011 / 14:56:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !Object methodsFor:'debugging'!
 
 inspectorExtraAttributes
@@ -401,6 +1589,26 @@
     "Modified: / 04-10-2006 / 14:33:34 / cg"
 ! !
 
+!Object methodsFor:'testing'!
+
+isTestCaseLike
+
+    ^false
+
+    "Created: / 28-02-2011 / 21:30:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Object methodsFor:'debugging'!
+
+newInspector2Tab
+
+    "Use Smalltalk>>at: to trick the dependency detector"
+
+    ^(Smalltalk at: #'Tools::Inspector2Tab') 
+        ifNil:[self error:'Inspector2 not available!! Something is rotten...']
+        ifNotNil:[(Smalltalk at: #'Tools::Inspector2Tab') new]
+! !
+
 !OrderedCollection methodsFor:'inspecting'!
 
 inspectorClass
@@ -416,7 +1624,276 @@
     "
 ! !
 
-!RunArray methodsFor:'inspecting'!
+!PopUpMenu methodsFor:'converting'!
+
+asMenu
+
+    | menu  |
+    menu := Menu new receiver: menuView receiver.
+    1 to: self numberOfItems do:
+        [:i| | menuItem |
+        menuItem := MenuItem new
+                        label: (self labels at: i);
+                        value: (menuView selectors at: i);
+                        enabled: (menuView isEnabled: i);
+                        shortcutKey: (menuView shortKeys at: i);
+                        yourself.
+
+        (self subMenuAt: i) ifNotNil:
+            [menuItem submenu: (self subMenuAt: i) asMenu].
+        menu addItem: menuItem.
+        ].
+    ^menu.
+
+    "Created: / 18-10-2008 / 19:01:32 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProfileTree methodsFor:'accessing'!
+
+method
+
+    class ifNil:[^nil].
+    ^class >> selector
+
+    "Created: / 01-12-2007 / 22:50:16 / janfrog"
+    "Modified: / 07-11-2008 / 08:40:35 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProfileTree methodsFor:'accessing'!
+
+package
+
+    self method ifNil:[^nil].
+    ^self method package
+
+    "Created: / 01-12-2007 / 22:50:28 / janfrog"
+    "Modified: / 07-11-2008 / 08:40:35 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!RBMessageNode methodsFor:'libtool3 support'!
+
+highlightInCodeView: aCodeView
+
+    ^aCodeView highlightMessageNode: self
+
+    "Created: / 18-02-2008 / 17:51:11 / janfrog"
+! !
+
+!RBMessageNode methodsFor:'libtool3 support'!
+
+leftClickMenuInCodeView: aCodeView 
+    ^ aCodeView leftClickMenuForMessageNode: self.
+
+    "Created: / 18-02-2008 / 19:04:45 / janfrog"
+! !
+
+!RBMessageNode methodsFor:'libtool3 support'!
+
+middleClickMenuInCodeView: aCodeView 
+    ^ aCodeView middleClickMenuForMessageNode: self.
+
+    "Created: / 18-02-2008 / 19:04:58 / janfrog"
+! !
+
+!RBMessageNode methodsFor:'libtool3 support'!
+
+rightClickMenuInCodeView: aCodeView 
+    ^ aCodeView rightClickMenuForMessageNode: self.
+
+    "Created: / 18-02-2008 / 19:05:18 / janfrog"
+! !
+
+!RBProgramNode methodsFor:'stx:libtool support'!
+
+highlightInCodeView: aCodeView
+
+    aCodeView highlightClear
+
+    "Created: / 18-02-2008 / 17:48:12 / janfrog"
+! !
+
+!RBProgramNode methodsFor:'stx:libtool support'!
+
+leftClickMenuInCodeView: aCodeView 
+    ^ nil
+
+    "Created: / 18-02-2008 / 17:49:43 / janfrog"
+! !
+
+!RBProgramNode methodsFor:'stx:libtool support'!
+
+middleClickMenuInCodeView: aCodeView 
+    ^ nil
+
+    "Created: / 18-02-2008 / 17:49:57 / janfrog"
+! !
+
+!RBProgramNode methodsFor:'stx:libtool support'!
+
+rightClickMenuInCodeView: aCodeView 
+    ^ nil
+
+    "Created: / 18-02-2008 / 17:50:10 / janfrog"
+! !
+
+!RBVariableNode methodsFor:'libtool3 support'!
+
+highlightInCodeView: aCodeView
+
+    ^aCodeView highlightVariableNode: self
+
+    "Created: / 18-02-2008 / 17:51:44 / janfrog"
+! !
+
+!RBVariableNode methodsFor:'libtool3 support'!
+
+leftClickMenuInCodeView: aCodeView 
+    ^ aCodeView leftClickMenuForVariableNode: self.
+
+    "Created: / 01-09-2009 / 08:41:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!RBVariableNode methodsFor:'libtool3 support'!
+
+rightClickMenuInCodeView: aCodeView 
+    ^ aCodeView rightClickMenuForVariableNode: self.
+
+    "Created: / 18-02-2008 / 21:05:04 / janfrog"
+! !
+
+!RefactoryChange methodsFor:'performing-changes'!
+
+apply
+
+    "Added for compatibility with stx's Change classes"
+
+    ^RefactoryChangeManager performChange: self
+
+    "Created: / 26-11-2008 / 11:26:54 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!RefactoryChange methodsFor:'accessing'!
+
+changeLanguage
+
+    ^SmalltalkLanguage instance
+
+    "Created: / 02-02-2010 / 10:54:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!RefactoryChange methodsFor:'accessing'!
+
+delta
+
+    "Returns a delta to current state as symbol:
+        #+ .....the subject is to be added to the image (new)
+        #- .....the subject is to be removed from the image (old)
+        #= .....the image is up to date
+        #~ .....change version and image version differ
+        #? .....delta is unknown or N/A for this kind of change
+    "
+
+    ^#? "We don't know how to compute delta for generic change"
+! !
+
+!RefactoryChange methodsFor:'user interface'!
+
+inspect
+
+    ^super inspect
+
+   "
+        ^((CompositeRefactoryChange new)
+                changes: (Array with: self);
+                yourself) inspect
+
+   "
+! !
+
+!RefactoryChange methodsFor:'user interface'!
+
+inspector2TabBrowser
+
+    ^self newInspector2Tab
+        label: 'Changes';    
+        priority: 75;
+        application: (Tools::ChangeSetBrowser on: (ChangeSet with:self))
+! !
+
+!RefactoryChange methodsFor:'testing'!
+
+isClassChange
+
+    ^false
+! !
+
+!RefactoryChange methodsFor:'testing'!
+
+isClassDefinitionChange
+
+    ^false
+
+    "Created: / 29-10-2010 / 13:34:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!RefactoryChange methodsFor:'testing'!
+
+isComplexRefactoryChange
+    ^ false
+
+    "Created: / 26-11-2008 / 11:56:03 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!RefactoryChange methodsFor:'testing'!
+
+isCompositeChange
+    ^ false
+
+    "Created: / 26-11-2008 / 11:34:43 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!RefactoryChange methodsFor:'testing'!
+
+isCompositeRefactoryChange
+    ^ false
+
+    "Created: / 26-11-2008 / 11:34:43 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!RefactoryChange methodsFor:'testing'!
+
+isMethodCodeChange
+
+    ^false
+! !
+
+!RefactoryChange methodsFor:'accessing'!
+
+removed
+
+    ^(self objectAttributeAt: #removed) ? false
+
+    "Created: / 24-10-2009 / 21:10:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!RefactoryChange methodsFor:'accessing'!
+
+removed: aBoolean
+
+    ^self objectAttributeAt: #removed put: aBoolean
+
+    "Created: / 24-10-2009 / 21:11:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!RefactoryChange methodsFor:'accessing'!
+
+source
+
+    
+    ^self printString
+! !
+
+!RunArray methodsFor:'user interface'!
 
 inspectorClass
     "Re-reimplemented so that we don't get an ordered collection inspector
@@ -427,6 +1904,18 @@
     "Modified: / 30.10.1997 / 14:28:20 / cg"
 ! !
 
+!SelectionInListModelView methodsFor:'accessing'!
+
+textStartLeft
+    ^ textStartLeft
+! !
+
+!SelectionInListModelView methodsFor:'accessing'!
+
+textStartLeft:something
+    textStartLeft := something.
+! !
+
 !Set methodsFor:'inspecting'!
 
 inspectorClass
@@ -436,14 +1925,13 @@
     ^ SetInspectorView
 ! !
 
-!SharedPool class methodsFor:'inspecting'!
-
-inspectorClass
-    "{ Pragma: +optSpace }"
-
-    "redefined to launch a DictionaryInspector (instead of the default Inspector)."
-
-    ^ DictionaryInspectorView
+!SimpleView methodsFor:'queries'!
+
+isCodeView2
+
+    ^ false
+
+    "Created: / 20-07-2010 / 15:42:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
 ! !
 
 !Smalltalk class methodsFor:'inspecting'!
@@ -456,6 +1944,42 @@
     ^ DictionaryInspectorView
 ! !
 
+!StringCollection methodsFor:'debugging support'!
+
+inspector2TabText
+
+    ^self newInspector2Tab
+        label: 'String';
+        priority: 25;
+        view: ((ScrollableView for:TextView) contents: self asString; yourself)
+
+    "Created: / 17-02-2008 / 10:13:07 / janfrog"
+! !
+
+!Symbol methodsFor:'accessing'!
+
+formattedCode
+
+    "Used by CodeGenerator"
+
+    ^self
+
+    "Created: / 07-07-2009 / 20:03:21 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Text methodsFor:'debugging support'!
+
+inspector2TabText
+
+    ^self newInspector2Tab
+        label: 'Text';
+        priority: 75;
+        view: ((ScrollableView for:TextView) contents: self; yourself)
+
+    "Created: / 17-02-2008 / 09:03:36 / janfrog"
+    "Modified: / 17-02-2008 / 10:28:33 / janfrog"
+! !
+
 !Text methodsFor:'inspecting'!
 
 inspectorExtraAttributes
@@ -495,8 +2019,184 @@
     "Created: / 20-01-2011 / 12:19:05 / cg"
 ! !
 
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+alwaysOpenNewTabWhenCtrlClick
+
+    "
+        UserPreferences current alwaysOpenNewTabWhenCtrlClick 
+    "
+
+
+    ^ self at:#alwaysOpenNewTabWhenCtrlClick ifAbsent:false.
+
+    "Created: / 19-10-2008 / 08:00:53 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 14-02-2010 / 19:37:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+alwaysOpenNewTabWhenCtrlClick: aBoolean
+
+    self at:#alwaysOpenNewTabWhenCtrlClick put: aBoolean
+
+    "Created: / 19-10-2008 / 08:01:45 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+showBookmarkBar
+    "experimental."
+
+    ^ self at:#showBookmarkBar ifAbsent: true.
+
+    "
+     UserPreferences current showBookmarkBar
+     UserPreferences current showBookmarkBar:true
+     UserPreferences current showBookmarkBar:false
+    "
+
+    "Created: / 18-05-2011 / 16:48:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 03-06-2011 / 11:01:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+showBookmarkBar: aBoolean
+    "experimental."
+
+    ^ self at:#showBookmarkBar put: aBoolean
+
+    "
+     UserPreferences current showBookmarkBar
+     UserPreferences current showBookmarkBar:true
+     UserPreferences current showBookmarkBar:false
+    "
+
+    "Created: / 18-05-2011 / 17:28:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+showEmbeddedTestRunnerInBrowser
+    "experimental."
+
+    ^ self at:#showEmbeddedTestRunnerInBrowser ifAbsent:false
+
+    "
+     UserPreferences current showEmbeddedTestRunnerInBrowser
+     UserPreferences current showEmbeddedTestRunnerInBrowser:true
+     UserPreferences current showEmbeddedTestRunnerInBrowser:false
+    "
+
+    "Created: / 11-03-2010 / 10:11:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+showEmbeddedTestRunnerInBrowser:aBoolean
+    "experimental."
+
+    ^ self at:#showEmbeddedTestRunnerInBrowser put:aBoolean
+
+    "
+     UserPreferences current showEmbeddedTestRunnerInBrowser:true
+     UserPreferences current showEmbeddedTestRunnerInBrowser:false
+    "
+
+    "Created: / 11-03-2010 / 10:11:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+showMethodTemplate
+    "experimental."
+
+    ^ self at:#showMethodTemplate ifAbsent:true
+
+    "
+     UserPreferences current showMethodTemplate
+     UserPreferences current showMethodTemplate:true
+     UserPreferences current showMethodTemplate:false
+    "
+
+    "Created: / 12-02-2010 / 12:06:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+showMethodTemplate:aBoolean
+    "experimental."
+
+    ^ self at:#showMethodTemplate put:aBoolean
+
+    "
+     UserPreferences current showMethodTemplate:true
+     UserPreferences current showMethodTemplate:false
+    "
+
+    "Created: / 12-02-2010 / 12:05:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+useCodeView2InTools
+    ^self at:#useCodeView2InTools ifAbsent:false
+
+    "
+     UserPreferences current useCodeView2InTools 
+     UserPreferences current useCodeView2InTools:true 
+     UserPreferences current useCodeView2InTools:false"
+
+    "Created: / 12-02-2010 / 12:13:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 15-02-2010 / 09:26:16 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+useCodeView2InTools:aBoolean 
+    ^self at:#useCodeView2InTools put:aBoolean
+
+    "
+     UserPreferences current useCodeView2InBrowser:true
+     UserPreferences current useCodeView2InBrowser:false"
+    "Created: / 12-02-2010 / 12:14:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+webBrowserLikeLayout
+    "experimental."
+
+    ^ self at:#webBrowserLikeLayout ifAbsent: false
+
+    "
+     UserPreferences current webBrowserLikeLayout
+     UserPreferences current webBrowserLikeLayout:true
+     UserPreferences current webBrowserLikeLayout:false
+    "
+
+    "Created: / 07-06-2011 / 14:33:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing-prefs-browser'!
+
+webBrowserLikeLayout: aBoolean
+    "experimental."
+
+    ^ self at:#webBrowserLikeLayout put: aBoolean
+
+    "
+     UserPreferences current webBrowserLikeLayout
+     UserPreferences current webBrowserLikeLayout:true
+     UserPreferences current webBrowserLikeLayout:false
+    "
+
+    "Created: / 07-06-2011 / 14:31:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
 !stx_libtool class methodsFor:'documentation'!
 
 extensionsVersion_CVS
-    ^ '$Header: /cvs/stx/stx/libtool/extensions.st,v 1.30 2011-01-20 11:24:55 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libtool/extensions.st,v 1.31 2011-07-03 14:27:26 cg Exp $'
 ! !
\ No newline at end of file