Eliot Miranda uploaded a new version of Help-Squeak-Project to project The Trunk:
http://source.squeak.org/trunk/Help-Squeak-Project-eem.81.mcz
==================== Summary ====================
Name: Help-Squeak-Project-eem.81
Author: eem
Time: 11 November 2021, 8:29:34.594159 am
UUID: c316d08b-ce8b-4e20-9c07-e45311ab1ce5
Ancestors: Help-Squeak-Project-nice.80
Update Help on Command Key Mappings to reflect the addition of the Do menu to the main docking bar menu.
=============== Diff against Help-Squeak-Project-nice.80 ===============
Item was changed:
----- Method: SqueakTutorialsCommandKey class>>commandKeyMappings (in category 'pages') -----
commandKeyMappings
"This method was automatically generated. Edit it using:"
"SqueakTutorialsCommandKey edit: #commandKeyMappings"
^(HelpTopic
title: 'Command Key Mappings'
contents:
'Lower-case command keys
(use with Cmd key on Mac and Alt key on other platforms)
a Select all
b Browse it (selection is a class name or cursor is over a class-list or message-list)
c Copy selection
d Do it (selection is a valid expression)
e Exchange selection with prior selection
f Find text with a dialog
g Find the current selection again
j Repeat the last selection replacement
i Inspect it
k Set font
l Cancel text edit
m Implementors of it
n Senders of it
o Spawn current method
p Print it (selection is a valid expression)
q Query symbol (toggle all possible completion for a given prefix)
s Save (i.e. accept)
t Finds a Transcript (when cursor is over the desktop)
u Toggle alignment
v Paste
w Select/Delete preceding word (over text); Close-window (over morphic desktop)
x Cut selection
y Swap characters
z Undo
Note: for Do it, Senders of it, etc., a null selection will be expanded to a word or to the current line in an attempt to do what you want. Also note that Senders/Implementors of it will find the outermost keyword selector in a large selection, as when you have selected a bracketed expression or an entire line. Finally note that the same cmd-m and cmd-n (and cmd-v for versions) work in the message pane of most browsers.
Upper-case command keys
(use with Shift-Cmd, or Ctrl on Mac
or Shift-Alt on other platforms; sometimes Ctrl works too)
A Advance argument
B Browse it in this same browser (in System browsers only)
C Compare the selected text to the clipboard contents
D Debug-It
E Method strings containing it
F Insert ''ifFalse:''
G fileIn from it (a file name)
H Move cursor to top/home of text
I Inspect via Object Explorer
J Again many (apply the previous text command repeatedly until the end of the text)
K Set style
L Opens a FileList, bringing forward on that already exists if appropriate
M Select current type-in
N References to it (selection is a class name, or cursor is over a class-list or message-list)
O Open single-message browser (in message lists)
P Make project link
R opens a Recent Submissions browser
S Pretty-print a method in the current browser
T Insert ''ifTrue:''
U Convert linefeeds to carriage returns in selection
V Paste author''s initials
W Selectors containing it (in text); show-world-menu (when issued with cursor over desktop)
X Force selection to lowercase
Y Force selection to uppercase
Z Redo
Other special keys
Backspace Backward delete character
Shift-Bksp Backward select or delete word
Del Forward delete character
Shift-Del Forward delete word
Esc Pop up the context menu
Shift+Esc Pop up the World Menu
Cmd+Esc Close the active window
Ctrl+Esc Present a list of open windows
Cmd+\ Send the active window to the back
Tab Insert a tab char in a single-line selection or insert a tab at the beginning of each line in a multi-line selection
Shift-Tab Remove a tab from the beginning of each line in the selection
Shift-Cmd-_ (underscore) condense selection into one line
Cursor keys
left, right,
up, down Move cursor left, right, up or down
Ctrl-left Move cursor left one word
Ctrl-right Move cursor right one word
Home Move cursor to begin of line or begin of text
End Move cursor to end of line or end of text
PgUp, Ctrl-up Move cursor up one page
PgDown, Ctrl-Dn Move cursor down one page
Note all these keys can be used together with Shift to define or enlarge the selection. You cannot however shrink that selection again, as in some other systems.
Other Cmd-key combinations (not available on all platforms)
Return Insert return followed by as many tabs as the previous line
(with a further adjustment for additional brackets in that line)
Space Select the current word as with double clicking
Enclose the selection in a kind of bracket. Each is a toggle.
(not available on all platforms)
Ctrl-( Toggle enclosure within parentheses
Cmd-[ Toggle enclosure within brackets
Crtl-{ Toggle enclosure within curly braces
Ctrl-'' Toggle enclosure within double-quotes
Cmd-'' Toggle enclosure within single-quotes
Note also that you can double-click just inside any of the above delimiters, or at the beginning or end of a line, to select the text enclosed.
Text Emphasis
(not available on all platforms)
Cmd-1 type the first method argument
Cmd-2 type the second method argument
Cmd-3 type the third method argument
Cmd-4 type the fourth method argument
Cmd-5 for future use
Cmd-6 color, action-on-click, link to class comment, link to method, url
Brings up a menu. To remove these properties, select
more than the active part and then use command-0.
Cmd-7 bold
Cmd-8 italic
Cmd-9 negative kern (letters 1 pixel closer)
Cmd-0 make plain (removes all emphasis and kerning)
Cmd-- underlined
Cmd-= struck out
Docking Bar
Ctrl-<n> opens the n-th (where n is between 0 and 7) menu if such exists, otherwise it moves the keyboard focus to the Search Bar. Currently this means:
Ctrl-0 Activates Search Bar or Scratch Pad
Ctrl-1 Squeak menu
Ctrl-2 Projects menu
Ctrl-3 Tools menu
Ctrl-4 Apps menu
+ Ctrl-5 Do menu (an editable menu of useful expressions)
+ Ctrl-6 Extras menu
+ Ctrl-7 Windows menu
+ Ctrl-8 Help menu
- Ctrl-5 Extras menu
- Ctrl-6 Windows menu
- Ctrl-7 Help menu
!!' readStream nextChunkText)
key: #commandKeyMappings;
shouldStyle: false!
Patrick Rein uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-pre.961.mcz
==================== Summary ====================
Name: Collections-pre.961
Author: pre
Time: 10 November 2021, 3:22:38.585616 pm
UUID: f3d7c967-3623-5f4b-8166-59aeeeee1600
Ancestors: Collections-eem.960
Recategorizes unclassified or misclassified methods.
=============== Diff against Collections-eem.960 ===============
Item was changed:
+ ----- Method: Base64MimeConverter class>>decodeInteger: (in category 'convenience') -----
- ----- Method: Base64MimeConverter class>>decodeInteger: (in category 'as yet unclassified') -----
decodeInteger: mimeString
| bytes sum |
"Decode the MIME string into an integer of any length"
bytes := (Base64MimeConverter mimeDecodeToBytes:
(ReadStream on: mimeString)) contents.
sum := 0.
bytes reverseDo: [:by | sum := sum * 256 + by].
^ sum!
Item was changed:
+ ----- Method: Base64MimeConverter class>>encodeInteger: (in category 'convenience') -----
- ----- Method: Base64MimeConverter class>>encodeInteger: (in category 'as yet unclassified') -----
encodeInteger: int
| strm |
"Encode an integer of any length and return the MIME string"
strm := WriteStream on: (ByteArray new: int digitLength).
1 to: int digitLength do: [:ii | strm nextPut: (int digitAt: ii)].
^ ((self mimeEncode: strm readStream) contents) copyUpTo: $= "remove padding"!
Item was changed:
+ ----- Method: Base64MimeConverter class>>initialize (in category 'class initialization') -----
- ----- Method: Base64MimeConverter class>>initialize (in category 'as yet unclassified') -----
initialize
FromCharTable := Array new: 256. "nils"
ToCharTable := ($A to: $Z) , ($a to: $z) , ($0 to: $9) , '+/'.
ToCharTable keysAndValuesDo: [:ind :char |
FromCharTable at: char asciiValue + 1 put: ind - 1].!
Item was changed:
+ ----- Method: Base64MimeConverter class>>mimeDecodeToBytes: (in category 'convenience') -----
- ----- Method: Base64MimeConverter class>>mimeDecodeToBytes: (in category 'as yet unclassified') -----
mimeDecodeToBytes: aStream
"Return a ReadStream of the original ByteArray. aStream has only 65 innocuous character values. aStream is not binary. (See class comment). 4 bytes in aStream goes to 3 bytes in output."
| me |
aStream position: 0.
me := self new mimeStream: aStream.
me dataStream: (WriteStream on: (ByteArray new: aStream size * 3 // 4)).
me mimeDecodeToByteArray.
^ me dataStream readStream!
Item was changed:
+ ----- Method: Base64MimeConverter class>>mimeDecodeToChars: (in category 'convenience') -----
- ----- Method: Base64MimeConverter class>>mimeDecodeToChars: (in category 'as yet unclassified') -----
mimeDecodeToChars: aStream
"Return a ReadWriteStream of the original String. aStream has only 65 innocuous character values. It is not binary. (See class comment). 4 bytes in aStream goes to 3 bytes in output."
| me |
aStream position: 0.
me := self new mimeStream: aStream.
me dataStream: (WriteStream on: (String new: aStream size * 3 // 4)).
me mimeDecode.
^ me dataStream readStream!
Item was changed:
+ ----- Method: Base64MimeConverter class>>mimeEncode: (in category 'convenience') -----
- ----- Method: Base64MimeConverter class>>mimeEncode: (in category 'as yet unclassified') -----
mimeEncode: aStream
"Return a ReadWriteStream of characters. The data of aStream is encoded as 65 innocuous characters. (See class comment). 3 bytes in aStream goes to 4 bytes in output."
^self mimeEncode: aStream multiLine: true atStart: true!
Item was changed:
+ ----- Method: Base64MimeConverter class>>mimeEncode:multiLine: (in category 'convenience') -----
- ----- Method: Base64MimeConverter class>>mimeEncode:multiLine: (in category 'as yet unclassified') -----
mimeEncode: aStream multiLine: aBool
"Return a ReadWriteStream of characters. The data of aStream is encoded as 65 innocuous characters. (See class comment). 3 bytes in aStream goes to 4 bytes in output."
^self mimeEncode: aStream multiLine: aBool atStart: true!
Item was changed:
+ ----- Method: Base64MimeConverter class>>mimeEncode:multiLine:atStart: (in category 'private - convenience') -----
- ----- Method: Base64MimeConverter class>>mimeEncode:multiLine:atStart: (in category 'as yet unclassified') -----
mimeEncode: aStream multiLine: aBool atStart: resetInput
"Return a ReadStream of characters. The data of aStream is encoded as 65 innocuous characters. (See class comment). 3 bytes in aStream goes to 4 bytes in output."
| me |
resetInput ifTrue:[aStream position: 0].
me := self new dataStream: aStream.
me multiLine: aBool.
me mimeStream: (WriteStream on: (String new: aStream size + 20 * 4 // 3)).
me mimeEncode.
^ me mimeStream readStream!
Item was changed:
+ ----- Method: Base64MimeConverter class>>mimeEncodeContinue: (in category 'private - convenience') -----
- ----- Method: Base64MimeConverter class>>mimeEncodeContinue: (in category 'as yet unclassified') -----
mimeEncodeContinue: aStream
"Return a ReadWriteStream of characters. The data of aStream is encoded as 65 innocuous characters. (See class comment). 3 bytes in aStream goes to 4 bytes in output."
^self mimeEncode: aStream multiLine: true atStart: false!
Item was changed:
+ ----- Method: Bit7MimeConverter>>mimeDecode (in category 'conversion') -----
- ----- Method: Bit7MimeConverter>>mimeDecode (in category 'as yet unclassified') -----
mimeDecode
dataStream nextPutAll: mimeStream upToEnd.
^ dataStream!
Item was changed:
+ ----- Method: Bit7MimeConverter>>mimeEncode (in category 'conversion') -----
- ----- Method: Bit7MimeConverter>>mimeEncode (in category 'as yet unclassified') -----
mimeEncode
| character |
[dataStream atEnd] whileFalse: [
character := dataStream next.
self assert: character asciiValue < 128.
mimeStream nextPut: character].
^ mimeStream!
Item was changed:
+ ----- Method: Generator class>>on: (in category 'instance creation') -----
- ----- Method: Generator class>>on: (in category 'instance-creation') -----
on: aBlock
^ self basicNew initializeOn: aBlock!
Item was changed:
+ ----- Method: NullMimeConverter>>mimeDecode (in category 'conversion') -----
- ----- Method: NullMimeConverter>>mimeDecode (in category 'as yet unclassified') -----
mimeDecode
dataStream nextPutAll: mimeStream upToEnd.
^ dataStream!
Item was changed:
+ ----- Method: NullMimeConverter>>mimeEncode (in category 'conversion') -----
- ----- Method: NullMimeConverter>>mimeEncode (in category 'as yet unclassified') -----
mimeEncode
mimeStream nextPutAll: dataStream upToEnd.
^ mimeStream
!
Item was changed:
+ ----- Method: QuotedPrintableMimeConverter>>encodeChar:to: (in category 'private - encoding') -----
- ----- Method: QuotedPrintableMimeConverter>>encodeChar:to: (in category 'as yet unclassified') -----
encodeChar: aChar to: aStream
(self conversionNeededFor: aChar)
ifFalse: [aStream nextPut: aChar]
ifTrue: [aStream nextPut: $=;
nextPut: (Character digitValue: aChar asciiValue // 16);
nextPut: (Character digitValue: aChar asciiValue \\ 16)].
!
Item was changed:
+ ----- Method: QuotedPrintableMimeConverter>>reservedCharacters (in category 'private - encoding') -----
- ----- Method: QuotedPrintableMimeConverter>>reservedCharacters (in category 'as yet unclassified') -----
reservedCharacters
^ '=' !
Item was changed:
+ ----- Method: Stream>>sleep (in category 'file directory') -----
- ----- Method: Stream>>sleep (in category 'as yet unclassified') -----
sleep
"an FTP-based stream might close the connection here"!
Eliot Miranda uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-eem.1786.mcz
==================== Summary ====================
Name: Morphic-eem.1786
Author: eem
Time: 4 November 2021, 12:44:06.340704 pm
UUID: 6a2f11a1-29ae-4254-b9a7-585512357c51
Ancestors: Morphic-mt.1785
Add a Find Workspace... item to teh end of the Find Window menu. This finds and activates a workspace in any project (my life has too many projecvts with too many workspaces in them to lve without this kind of help).
Abstracting the facility to search for other kinds of windows is left as an exercise to the reader (I don't see the need for being able to find other than workspaces, but that might be just me).
Needs System-eem.1245.
=============== Diff against Morphic-mt.1785 ===============
Item was added:
+ ----- Method: MorphicProject>>topMorphicProject (in category 'accessing') -----
+ topMorphicProject
+ parentProject == self ifTrue: [^self].
+ parentProject ifNil: [self nilParentError].
+ ^parentProject isMorphic
+ ifTrue: [parentProject topMorphicProject]
+ ifFalse: [self]!
Item was changed:
----- Method: TheWorldMainDockingBar>>listWindowsOn: (in category 'submenu - windows') -----
listWindowsOn: menu
| windows |
windows := self allVisibleWindows sorted: [:winA :winB |
((winA model isNil or: [winB model isNil]) or: [winA model name = winB model name])
ifTrue: [winA label < winB label]
ifFalse: [winA model name < winB model name]].
windows ifEmpty: [
menu addItem: [ :item |
item
contents: 'No Windows' translated;
isEnabled: false ] ].
windows do: [ :each |
| windowColor |
windowColor := (each model respondsTo: #windowColorToUse)
ifTrue: [each model windowColorToUse]
ifFalse: [UserInterfaceTheme current get: #uniformWindowColor for: Model].
menu addItem: [ :item |
item
contents: (self windowMenuItemLabelFor: each);
icon: (self colorIcon: windowColor);
target: each;
selector: #comeToFront;
subMenuUpdater: self
selector: #windowMenuFor:on:
arguments: { each };
action: [ each beKeyWindow; expand ] ] ].
menu
addLine;
add: 'Collapse all windows' target: (Project current world) selector: #collapseAllWindows;
add: 'Close all windows' target: self selector: #closeAllWindowsUnsafe;
addItem: [:item | item
contents: 'Close all windows without changes';
target: self;
icon: MenuIcons smallBroomIcon;
selector: #closeAllWindows];
+ add: 'Close all windows but workspaces' target: self selector: #closeAllWindowsButWorkspaces;
+ addItem:
+ [ :item |
+ item
+ contents: 'Find Workspace...';
+ target: self;
+ selector: #findWorkspace;
+ subMenuUpdater: self
+ selector: #workspacesMenuFor:
+ arguments: #()]!
- add: 'Close all windows but workspaces' target: self selector: #closeAllWindowsButWorkspaces.!
Item was added:
+ ----- Method: TheWorldMainDockingBar>>selectWorkspace:window:inProject:contents: (in category 'submenu - windows') -----
+ selectWorkspace: aWorkspace window: aSystemWindow inProject: aMorphicProject contents: contents
+ aMorphicProject
+ addDeferredUIMessage: [aSystemWindow comeToFront];
+ enter "Does nothing if already the current project..."
+ !
Item was added:
+ ----- Method: TheWorldMainDockingBar>>workspacesMenuFor: (in category 'submenu - windows') -----
+ workspacesMenuFor: anUpdatingMenuMorph
+ | allWorkspaces |
+ allWorkspaces := Set new.
+ Project current topMorphicProject withChildrenDo:
+ [:project|
+ project world submorphs do:
+ [:m|
+ (m model isKindOf: Workspace) ifTrue:
+ [allWorkspaces add:
+ { m model.
+ m.
+ project.
+ m model contents ifEmpty:
+ [(m model dependents detect: [:d| d isTextView] ifNone: nil) textMorph contents] }]]].
+ "Sort workspaces with non-empty ones first..."
+ (allWorkspaces sorted:
+ [:t1 :t2|
+ t1 last isEmpty == t2 last isEmpty
+ ifTrue: [t1 second label <= t2 second label]
+ ifFalse: [t1 last notEmpty]]) do:
+ [:tuple|
+ anUpdatingMenuMorph addItem:
+ [:item | item
+ contents: tuple second label, ': ', (tuple last asString contractTo: 128);
+ target: self;
+ selector: #selectWorkspace:window:inProject:contents:;
+ arguments: tuple]]!
Eliot Miranda uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-eem.1245.mcz
==================== Summary ====================
Name: System-eem.1245
Author: eem
Time: 4 November 2021, 12:39:44.080578 pm
UUID: c5406b85-50fb-4666-baf7-d995bdb2da41
Ancestors: System-eem.1244
Project: Abstract nilParentError, shared between a couple of accessors (new topMorphicProject). Add an instance side topProject to compliment topMorphicProject.
=============== Diff against System-eem.1244 ===============
Item was changed:
----- Method: Project>>isTopProject (in category 'sub-projects & hierarchy') -----
isTopProject
+ "Answer if this is the top project (its own parent).
- "Return true only if this is the top project (its own parent).
Also include the test here for malformed project hierarchy."
parentProject == self ifTrue: [^ true].
+ parentProject == nil ifTrue: [self nilParentError].
- parentProject == nil ifTrue: [self error: 'No project should have a nil parent'].
^ false!
Item was added:
+ ----- Method: Project>>nilParentError (in category 'accessing') -----
+ nilParentError
+ self error: 'No project should have a nil parent'!
Item was added:
+ ----- Method: Project>>topProject (in category 'accessing') -----
+ topProject
+ "Answer the topProject for this project's hierarchy"
+
+ parentProject == self ifTrue: [^self].
+ parentProject == nil ifTrue: [self nilParentError].
+ ^parentProject topProject!
Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-eem.1420.mcz
==================== Summary ====================
Name: Kernel-eem.1420
Author: eem
Time: 2 November 2021, 8:11:49.057099 am
UUID: 3b580b38-8061-4dd8-9485-3fec3dd2c04a
Ancestors: Kernel-eem.1419
Merge Kernel-ct.1407
Fixes #isPrimFailToken: for objects that do not implement #isArray in a conventional way, or that do not implement it all. The following should be debuggable without any problems, but currently is not due to a regression in Kernel-eem.1366.
Fur more information, see: http://forum.world.st/The-Trunk-Kernel-eem-1366-mcz-td5126558.html
=============== Diff against Kernel-eem.1419 ===============
Item was changed:
----- Method: Context>>isPrimFailToken: (in category 'private') -----
isPrimFailToken: contextOrPrimFailToken
"Answer if contextOrPrimFailToken, which will either be a Context object or
a primitive fail token (a tuple of the PrimitiveFailToken unique object and
a primitive failure code), is the latter. This should only be used with the
(possibly indirect) results of Context>>doPrimitive:method:receiver:args:"
+ ^ (self objectClass: contextOrPrimFailToken) == Array
- ^contextOrPrimFailToken isArray
and: [contextOrPrimFailToken size = 2
and: [(contextOrPrimFailToken at: 1) == PrimitiveFailToken]]!