[squeak-dev] The Trunk: Morphic-ct.1841.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Jan 3 21:13:02 UTC 2022
Christoph Thiede uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-ct.1841.mcz
==================== Summary ====================
Name: Morphic-ct.1841
Author: ct
Time: 3 January 2022, 10:12:56.140397 pm
UUID: 13c07ce7-f89f-7b48-b5e8-baa520ea1951
Ancestors: Morphic-ct.1840
Improves multilingual support at various places.
=============== Diff against Morphic-ct.1840 ===============
Item was changed:
----- Method: FontImporterTool>>buildButtonBarWith: (in category 'toolbuilder') -----
buildButtonBarWith: builder
"Build the button bar"
| panelSpec buttonSpec |
panelSpec := builder pluggablePanelSpec new.
panelSpec
layout: #horizontal;
children: OrderedCollection new.
buttonSpec := builder pluggableButtonSpec new
model: self;
label: 'Import' translated;
+ help: 'Include the font data in the image and provide a TextStyle for the font' translated;
- help: 'Include the font data in the image and provide a TextStyle for the font';
action: #import;
yourself.
panelSpec children addLast: buttonSpec.
buttonSpec := builder pluggableButtonSpec new
model: self;
label: 'Close' translated;
action: #close;
yourself.
panelSpec children addLast: buttonSpec.
^panelSpec!
Item was changed:
----- Method: FontImporterTool>>import (in category 'actions') -----
import
| megaSize filenames fonts |
fonts := self currentSelection.
filenames := fonts allFilenames.
megaSize := ((filenames inject: 0 into: [ :sum :fn |
sum + (FileStream readOnlyFileNamed: fn do: [:file | file size])]) / (1024 * 1024)) asFloat.
(UIManager default confirm: (
'About to import {1}{2}.\\This is at least {3} MB of space required in the image.\
Please respect the copyright and embedding restrictions of the font.\
Proceed?'
+ withCRs translated format: {
- withCRs format: {
self currentParent
ifNotNil: [:p| p fontname, ' ', self currentSelection fontname]
ifNil: [self currentSelection fontname].
+ filenames size > 1 ifTrue: [' ({1} font files)' translated format: {filenames size}] ifFalse: [''].
- filenames size > 1 ifTrue: [' (', filenames size, ' font files)'] ifFalse: [''].
megaSize printShowingDecimalPlaces: 2}))
ifTrue: [
filenames do: [:filename | | readFonts |
readFonts := TTCFontDescription addFromTTFile: filename.
readFonts isCollection
ifFalse: [TTCFont newTextStyleFromTT: readFonts]
ifTrue: [self importFontFamily: readFonts]]].
self allFonts: nil. "force redraw"
TTCFont registerAll.!
Item was changed:
----- Method: FontImporterTool>>link (in category 'actions') -----
link
| filenames fonts |
fonts := self currentSelection.
self warningSeen ifFalse: [
+ (Project uiManager confirm: (
- (UIManager default confirm: (
'Note that linking a font instead of importing may make the
image un-portable, since the linked font must be present on
the system the next time the image is run.
+ This warning is only shown once per session.' translated) trueChoice: 'Proceed' translated falseChoice: 'Cancel' translated)
- This warning is only shown once per session.' ) trueChoice: 'Proceed' falseChoice: 'Cancel')
ifFalse: [^ self].
self warningSeen: true]..
filenames := fonts allFilenames.
filenames do: [:filename | | readFonts |
readFonts := TTFileDescription readFontsFrom: filename.
readFonts isCollection
ifFalse: [TTCFont newTextStyleFromTT: readFonts]
ifTrue: [self importFontFamily: readFonts]].
self allFonts: nil. "force redraw"
TTCFont registerAll.!
Item was changed:
----- Method: KeyboardExerciser>>drawOn: (in category 'drawing') -----
drawOn: aCanvas
super drawOn: aCanvas.
aCanvas
+ drawString: 'Move your mouse cursor to here and start typing. Try modifiers, too.' translated
- drawString: 'Move your mouse cursor to here and start typing. Try modifiers, too.'
at: self topLeft
font: Preferences standardButtonFont
color: Color gray.!
Item was changed:
----- Method: KeyboardExerciser>>logEvent: (in category 'event handling') -----
logEvent: evt
| eventMorph |
evt = self lastEvent
ifTrue: [^ self logEventRepetition: evt].
eventMorph := evt asMorph.
eventMorph
setProperty: #event toValue: evt copy;
+ balloonText: ('Click to inspect. Shift+click to explore.\\Virtual key: {8}\Virtual modifiers: {5}\\Physical key: {9}\Physical modifiers: {6}\\Key value: 0x{1} ({2}) \Key character: {3}\Key string: {4}\\{7}' withCRs translated format: {
- balloonText: ('Click to inspect. Shift+click to explore.\\Virtual key: {8}\Virtual modifiers: {5}\\Physical key: {9}\Physical modifiers: {6}\\Key value: 0x{1} ({2}) \Key character: {3}\Key string: {4}\\{7}' withCRs format: {
evt keyValue printPaddedWith: $0 to: 2 base: 16.
evt keyValue.
evt isKeystroke ifTrue: [evt keyCharacter printString] ifFalse: ['-'].
evt isKeystroke ifTrue: [evt keyString printString] ifFalse: ['-'].
(evt virtualModifiers joinSeparatedBy: ' ') asUppercase.
(evt physicalModifiers joinSeparatedBy: ' ') asUppercase.
evt printString.
evt virtualKey printString.
evt physicalKey asString printString}).
eventMorph
on: #mouseEnter send: #handleEvent:emphasize: to: self;
on: #mouseLeave send: #handleEvent:deemphasize: to: self;
on: #mouseDown send: #handleEvent:inspect: to: self.
self addMorphBack: eventMorph.!
Item was changed:
----- Method: KeyboardExerciser>>logEventRepetition: (in category 'event handling') -----
logEventRepetition: evt
| label lastEvents box |
(self submorphs last hasProperty: #repetition)
ifTrue: [box := self submorphs last. label := box submorphs first]
ifFalse: [
box := Morph new
setProperty: #repetition toValue: true;
color: Color transparent;
layoutPolicy: TableLayout new;
hResizing: #shrinkWrap;
vResizing:#shrinkWrap;
yourself.
label := '' asText asMorph lock.
box addMorph: label.
box setProperty: #event toValue: (OrderedCollection with: self lastEvent).
self addMorphBack: box].
lastEvents := box valueOfProperty: #event.
lastEvents add: evt copy.
box setProperty: #event toValue: lastEvents.
label newContents: (('x ', (lastEvents size)) asText
addAttribute: (TextFontReference toFont: Preferences standardButtonFont);
yourself).
box balloonText: ('{1}{2}' format: {
+ lastEvents size > 10 ifTrue: ['... {1} older events and:\' withCRs translated format: {lastEvents size - 10}] ifFalse: [''].
- lastEvents size > 10 ifTrue: ['... ', (lastEvents size - 10), ' older events and:', String cr] ifFalse: [''].
(lastEvents last: (10 min: lastEvents size)) joinSeparatedBy: String cr.
}).
box
on: #mouseEnter send: #handleEvent:emphasize: to: self;
on: #mouseLeave send: #handleEvent:deemphasize: to: self;
on: #mouseDown send: #handleEvent:inspect: to: self.!
Item was changed:
----- Method: MenuItemMorph>>debugAction (in category 'browse') -----
debugAction
(Process
forBlock: [self doButtonAction]
runUntil: [:context | context selector = self effectiveActionSelector])
+ debugWithTitle: ('Debug menu action "{1}" in model "{2}"' translated format: {self contents. self target printString}).!
- debugWithTitle: ('Debug menu action "{1}" in model "{2}"' format: {self contents. self target printString}).!
Item was changed:
----- Method: MenuMorph>>addItem (in category 'menu') -----
addItem
| string sel |
+ string := Project uiManager request: 'Label for new item?' translated.
- string := UIManager default request: 'Label for new item?'.
string isEmpty ifTrue: [^ self].
+ sel := Project uiManager request: 'Selector?' translated.
- sel := UIManager default request: 'Selector?'.
sel isEmpty ifFalse: [sel := sel asSymbol].
self add: string action: sel.
!
Item was changed:
----- Method: MenuMorph>>addTitle (in category 'menu') -----
addTitle
| string |
+ string := Project uiManager request: 'Title for this menu?' translated.
- string := UIManager default request: 'Title for this menu?'.
string isEmpty ifTrue: [^ self].
self addTitle: string.
!
Item was changed:
----- Method: MenuMorph>>detachSubMenu: (in category 'menu') -----
detachSubMenu: evt
| possibleTargets item subMenu index |
possibleTargets := self items select:[:any| any hasSubMenu].
possibleTargets size > 0 ifTrue:[
+ index := Project uiManager
- index := UIManager default
chooseFrom: (possibleTargets collect:[:t| t contents asString])
+ title: 'Which menu?' translated.
- title: 'Which menu?'.
index = 0 ifTrue:[^self]].
item := possibleTargets at: index.
subMenu := item subMenu.
subMenu ifNotNil: [
item subMenu: nil.
item delete.
subMenu stayUp: true.
subMenu popUpOwner: nil.
subMenu addTitle: item contents.
evt hand attachMorph: subMenu].
!
Item was changed:
----- Method: MenuMorph>>showKeyboardHelp (in category 'keystroke helpers') -----
showKeyboardHelp
| help |
help := self balloonMorphClass
+ string: 'Enter text to narrow selection\down to matching items ' translated
- string: 'Enter text to narrow selection\down to matching items ' withCRs
for: self
corner: #topLeft.
help popUpAt: self topCenter forHand: self activeHand!
Item was changed:
----- Method: MenuMorph>>toggleStayUp: (in category 'menu') -----
toggleStayUp: evt
"Toggle my 'stayUp' flag and adjust the menu item to reflect its new state."
self items do: [:item |
item isStayUpItem ifTrue:
[self stayUp: stayUp not.
stayUp
+ ifTrue: [item contents: 'dismiss this menu' translated]
+ ifFalse: [item contents: 'keep this menu up' translated]]].
- ifTrue: [item contents: 'dismiss this menu']
- ifFalse: [item contents: 'keep this menu up']]].
evt hand releaseMouseFocus: self.
+ stayUp ifFalse: [self topRendererOrSelf delete].!
- stayUp ifFalse: [self topRendererOrSelf delete].
- !
Item was changed:
----- Method: MorphicProject>>loadFromServer: (in category 'file in/out') -----
loadFromServer: newerAutomatically
"If a newer version of me is on the server, load it."
| pair resp server |
self assureIntegerVersion.
self isCurrentProject ifTrue: ["exit, then do the command"
^ self armsLengthCommand: #loadFromServer withDescription: 'Loading' translated
].
server := self tryToFindAServerWithMe ifNil: [^ nil].
pair := self class mostRecent: self name onServer: server.
pair first ifNil: [^ self inform: ('can''t find file on server for {1}' translated format: {self name})].
self currentVersionNumber > pair second ifTrue: [
^ self inform: ('That server has an older version of the project.' translated)].
version = (Project parseProjectFileName: pair first) second ifTrue: [
resp := (UIManager default chooseFrom:
(Array with: 'Reload anyway' translated
with: 'Cancel' translated withCRs)
title: 'The only changes are the ones you made here.' translated).
resp ~= 1 ifTrue: [^ nil]
] ifFalse: [
newerAutomatically ifFalse: [
resp := (UIManager default
+ chooseFrom: {'Load it' translated. 'Cancel' translated}
+ title: 'A newer version exists on the server.' translated).
- chooseFrom: #('Load it' 'Cancel')
- title: 'A newer version exists on the server.').
resp ~= 1 ifTrue: [^ nil]
].
].
"let's avoid renaming the loaded change set since it will be replacing ours"
self projectParameters at: #loadingNewerVersion put: true.
ComplexProgressIndicator new
targetMorph: nil;
historyCategory: 'project loading';
withProgressDo: [
ProjectLoading
installRemoteNamed: pair first
from: server
named: self name
in: parentProject
+ ]!
- ]
- !
Item was changed:
----- Method: ObjectExplorerWrapper>>asString (in category 'converting') -----
asString
| explorerString label separator |
explorerString :=
[self objectString]
on: Error
+ do: ['<error: {1} in {2}: evaluate "{3}" to debug>' translated format: {self object class name. #asExplorerString. self itemName , ' asExplorerString'}].
- do: ['<error: ', self object class name, ' in asExplorerString: evaluate "' , self itemName , ' asExplorerString" to debug>'].
(explorerString includes: Character cr)
ifTrue: [explorerString := explorerString withSeparatorsCompacted].
label := self itemName ifNil: [''].
(label includes: Character cr)
ifTrue: [label := label withSeparatorsCompacted].
separator := self class showContentsInColumns
ifTrue: [String tab]
ifFalse: [label ifEmpty: [''] ifNotEmpty: [': ']].
^ '{1}{2}{3}' format: {label. separator. explorerString}!
Item was changed:
----- Method: PasteUpMorph>>saveOnFile (in category 'objects from disk') -----
saveOnFile
"Ask the user for a filename and save myself on a SmartReferenceStream file. Writes out the version and class structure. The file is fileIn-able. UniClasses will be filed out."
| aFileName fileStream |
self flag: #bob0302.
self isWorldMorph ifTrue: [^self project saveAs].
+ aFileName := ('my {1}' translated format: {self class name}) , '.project' asFileName. "do better?"
- aFileName := ('my {1}.project' translated format: {self class name}) asFileName. "do better?"
aFileName := UIManager default saveFilenameRequest: 'File name?' translated
initialAnswer: aFileName.
aFileName ifNil: [^ Beeper beep].
self allMorphsDo: [:m | m prepareToBeSaved].
fileStream := FileStream newFileNamed: aFileName.
fileStream fileOutClass: nil andObject: self. "Puts UniClass definitions out anyway"!
Item was changed:
----- Method: PluggableButtonMorph>>debugAction (in category 'debug menu') -----
debugAction
self updateArguments.
(Process
forBlock: [self doButtonAction]
runUntil: [:context | context selector = self effectiveActionSelector])
+ debugWithTitle: ('Debug button action "{1}" in model "{2}"' translated format: {self label. self target printString}).!
- debugWithTitle: ('Debug button action "{1}" in model "{2}"' format: {self label. self target printString}).!
Item was changed:
----- Method: PluggableListMorph>>debugGetList (in category 'debug and other') -----
debugGetList
(Process
forBlock: [model perform: getListSelector]
runUntil: [:context | context selector = getListSelector])
+ debugWithTitle: ('Debug get-list invocation in model "{1}"' translated format: {model printString}).!
- debugWithTitle: ('Debug get-list invocation in model "{1}"' format: {model printString}).!
Item was changed:
----- Method: PolygonMorph>>smoothOrSegmentedPhrase (in category 'access') -----
smoothOrSegmentedPhrase
- | lineName |
- lineName := (closed
- ifTrue: ['outline']
- ifFalse: ['line']) translated.
+ | lineName |
+ lineName := closed
+ ifTrue: ['outline' translated]
+ ifFalse: ['line' translated].
+
+ ^ self isCurve
+ ifTrue: ['make segmented {1}' translated format: {lineName}]
+ ifFalse: ['make smooth {1}' translated format: {lineName}]!
- ^ self isCurve
- ifTrue: ['make segmented {1}' translated format: {lineName}]
- ifFalse: ['make smooth {1}' translated format: {lineName}].!
Item was changed:
----- Method: SmalltalkEditor>>tallySelection (in category 'do-its') -----
tallySelection
"Treat the current selection as an expression; evaluate it and return the time took for this evaluation"
| code result rcvr ctxt v |
self lineSelectAndEmptyCheck: [^ self].
(model respondsTo: #doItReceiver)
ifTrue: [ rcvr := model doItReceiver.
ctxt := model doItContext]
ifFalse: [rcvr := ctxt := nil].
result := [ | cm |
code := self selectionAsStream.
cm := rcvr class evaluatorClass new
compiledMethodFor: code
in: ctxt
to: rcvr
notifying: self
ifFail: [morph flash. ^ self].
Time millisecondsToRun:
[v := cm valueWithReceiver: rcvr arguments: (ctxt ifNil: [#()] ifNotNil: [{ctxt}]) ].
]
on: OutOfScopeNotification
do: [ :ex | ex resume: true].
UIManager default
+ inform: ('<b>Expression</b>{1}<br>{2}<br><br><b>Time</b> (compile and execute)<br>{3} ms<br><br><b>Result</b><br>{4}' translated format: {
- inform: ('<b>Expression</b>{1}<br>{2}<br><br><b>Time</b> (compile and execute)<br>{3} ms<br><br><b>Result</b><br>{4}' format: {
rcvr ifNil: [''] ifNotNil: [' (', (rcvr printString truncateWithElipsisTo: 20), ')'].
(code contents truncateWithElipsisTo: 200) copyReplaceAll: String cr with: '<br>'.
result printString.
v printString truncateWithElipsisTo: 100}) asTextFromHtml.!
Item was changed:
----- Method: TextAnchor class>>alignmentExamples (in category 'examples') -----
alignmentExamples
"self alignmentExamples"
| anchoredMorph textMorph text demoMorph |
demoMorph := Morph new
changeTableLayout;
color: Color white;
hResizing: #shrinkWrap;
vResizing: #shrinkWrap;
yourself.
#(top center bottom) do: [:morphAlignment |
#(top center baseline bottom) do: [:textAlignment |
anchoredMorph := Morph new.
anchoredMorph textAnchorProperties verticalAlignment: {morphAlignment . textAlignment}.
anchoredMorph textAnchorProperties padding: (anchoredMorph textAnchorProperties padding top: 10).
text := Text streamContents: [ :stream |
stream
+ nextPutAll: ('Here is an {1}, {2} example: ' translated format: {morphAlignment . textAlignment});
- nextPutAll: ('Here is an {1}, {2} example: ' format: {morphAlignment . textAlignment});
nextPutAll: (Text
string: Character startOfHeader asString
attributes: {TextAnchor new anchoredMorph: anchoredMorph.
TextColor color: Color transparent});
+ nextPutAll: ' with the morph in the text.' translated].
- nextPutAll: ' with the morph in the text.'].
textMorph := text asMorph.
textMorph height: 100.
demoMorph addMorph: textMorph]].
demoMorph openInWorld!
Item was changed:
----- Method: TextEditor>>findReplace (in category 'menu messages') -----
findReplace
self
setSearchFromSelectionOrHistory;
setReplacementFromHistory.
(Project uiManager
+ request: 'Find what to replace?' translated
- request: 'Find what to replace?'
initialAnswer: FindText)
ifNotEmpty: [:find |
(Project uiManager
+ request: ('Replace ''{1}'' with?' translated format: {find})
- request: ('Replace ''{1}'' with?' format: {find})
initialAnswer: (ChangeText ifEmpty: [find])
onCancelReturn: nil)
ifNotNil: [:replace |
FindText := find.
ChangeText := replace.
self findReplaceAgainNow]]!
Item was changed:
----- Method: TheWorldMainDockingBar>>scaleFactorsOn: (in category 'submenu - extras') -----
scaleFactorsOn: menu
| presets currentScaleFactor currentPlatformScaleFactor |
currentScaleFactor := (Display relativeUiScaleFactor * 100) rounded.
currentPlatformScaleFactor := Display platformScaleFactorKnown
ifTrue: [(Display platformScaleFactor * 100) rounded].
presets := 100 to: 300 by: 25.
presets do: [:scale |
scale = 175 ifTrue: [menu addLine]. "TTCFont used after this line..."
menu addItem: [:item|
item
contents: ('{1}{2}%{3}' format: {
currentScaleFactor = scale ifTrue: ['<yes>'] ifFalse: ['<no>'].
scale.
DisplayScreen relativeScaleFactorEnabled
ifTrue: ['' "macOS"] ifFalse: [
scale = currentPlatformScaleFactor
+ ifTrue: [' (recommended)' translated] ifFalse: ['']]
- ifTrue: [' (recommended)'] ifFalse: ['']]
});
target: Display;
selector: #relativeUiScaleFactor:;
arguments: {scale / 100}]].
menu addLine.
menu addItem: [:item |
item
+ contents: ((presets includes: currentScaleFactor) not ifTrue: ['<yes>' , 'Custom: ' translated, currentScaleFactor, '% ...'] ifFalse: ['<no>' , 'Other scale factor...' translated]);
- contents: ((presets includes: currentScaleFactor) not ifTrue: ['<yes> Custom: ', currentScaleFactor, '% ...'] ifFalse: ['<no>Other scale factor...']);
target: self;
selector: #chooseCustomScaleFactor].!
More information about the Squeak-dev
mailing list
|