I had to manually load an up-to-date Morphic version before the update could succeed cuz MorphicExtras has an extension method on NewBalloonMorph but there's no update map.
On Tue, Mar 31, 2015 at 12:15 PM, Eliot Miranda eliot.miranda@gmail.com wrote:
I'm getting a failed update:
This package depends on the following classes: NewBalloonMorph You must resolve these dependencies before you will be able to load these definitions: NewBalloonMorph>>isBalloonHelp
latest update: #14275
On Tue, Mar 31, 2015 at 2:38 AM, commits@source.squeak.org wrote:
Marcel Taeumel uploaded a new version of Morphic to project The Trunk: http://source.squeak.org/trunk/Morphic-mt.794.mcz
==================== Summary ====================
Name: Morphic-mt.794 Author: mt Time: 31 March 2015, 11:38:42.253 am UUID: 765a2201-af4c-0948-b90d-72414d335160 Ancestors: Morphic-mt.793
New-style balloon morph added and used. Can be switched back to old-style balloon morphs via preferences.
New-style balloon morphs support:
- text (not only strings)
- layouting via text paragraph (not hard-cutted via: #noLineLongerThan:)
- positioning at current hand position (if not supplied with other
reference point)
In general, new-style balloon morphs have an improved readability.
=============== Diff against Morphic-mt.793 ===============
Item was changed: ----- Method: BalloonMorph class>>string:for:corner: (in category 'instance creation') ----- string: str for: morph corner: cornerName "Make up and return a balloon for morph. Find the quadrant that clips the text the least, using cornerName as a tie-breaker. tk 9/12/97" | tm vertices |
tm := self
getTextMorph: (str asString withNoLineLongerThan:
Preferences maxBalloonHelpLineLength)
for: morph.
tm := self getTextMorph: str for: morph. vertices := self getVertices: tm bounds. vertices := self getBestLocation: vertices for: morph corner: cornerName. ^ self new color: morph balloonColor; setVertices: vertices; addMorph: tm; setTarget: morph!
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 ' withCRs
help := BalloonMorph
string: 'Enter text to\narrow selection down\to matching
items ' withCRs for: self corner: #topLeft.
help popUpAt: self topCenter forHand: self activeHand!
help popUpForHand: self activeHand!
Item was added:
- ----- Method: Morph>>balloonMorphClass (in category 'halos and balloon
help') -----
- balloonMorphClass
^ NewBalloonMorph useNewBalloonMorph
ifTrue: [NewBalloonMorph]
ifFalse: [BalloonMorph]!
Item was changed: ----- Method: Morph>>showBalloon:hand: (in category 'halos and balloon help') ----- showBalloon: msgString hand: aHand "Pop up a balloon containing the given string, first removing any existing BalloonMorphs in the world."
| w balloon h | (w := self world) ifNil: [^ self]. h := aHand. h ifNil:[ h := w activeHand].
balloon := self balloonMorphClass
string: msgString
balloon := BalloonMorph
string: (msgString asString withNoLineLongerThan:
Preferences maxBalloonHelpLineLength) for: self balloonHelpAligner. balloon popUpFor: self hand: h.!
Item was added:
- Morph subclass: #NewBalloonMorph
instanceVariableNames: 'balloonOwner textMorph maximumWidth
orientation hasTail'
classVariableNames: 'UseNewBalloonMorph'
poolDictionaries: ''
category: 'Morphic-Widgets'!
- !NewBalloonMorph commentStamp: 'mt 3/31/2015 10:15' prior: 0!
- A balloon is a bubble with an optional tail. It contains rich text,
which describes something about its balloon-owner.!
Item was added:
- ----- Method: NewBalloonMorph class>>string:for: (in category 'instance
creation') -----
- string: str for: morph
^ self string: str for: morph corner: #bottomLeft!
Item was added:
- ----- Method: NewBalloonMorph class>>string:for:corner: (in category
'instance creation') -----
- string: message for: morph corner: symbol
^ self new
balloonOwner: morph;
setText: message;
orientation: symbol;
yourself!
Item was added:
- ----- Method: NewBalloonMorph class>>useNewBalloonMorph (in category
'preferences') -----
- useNewBalloonMorph
<preference: 'Use new-style balloon morphs'
category: #Morphic
description: 'The new-style balloon morphs are improved
for better reading quality and support rich text.'
type: #Boolean>
^ UseNewBalloonMorph ifNil: [true]!
Item was added:
- ----- Method: NewBalloonMorph class>>useNewBalloonMorph: (in category
'preferences') -----
- useNewBalloonMorph: aBoolean
UseNewBalloonMorph := aBoolean.!
Item was added:
- ----- Method: NewBalloonMorph>>balloonOwner (in category 'accessing')
- balloonOwner
^ balloonOwner!
Item was added:
- ----- Method: NewBalloonMorph>>balloonOwner: (in category 'accessing')
- balloonOwner: aMorph
balloonOwner := aMorph.!
Item was added:
- ----- Method: NewBalloonMorph>>bubbleBounds (in category 'geometry')
- bubbleBounds
^ self bounds insetBy: (0 @ self tailHeight corner: 0 @ self
tailHeight)!
Item was added:
- ----- Method: NewBalloonMorph>>bubbleInset (in category 'geometry')
- bubbleInset
^ 5@2!
Item was added:
- ----- Method: NewBalloonMorph>>defaultBorderColor (in category
'initialization') -----
- defaultBorderColor
^ self defaultColor muchDarker"Color black"!
Item was added:
- ----- Method: NewBalloonMorph>>defaultBorderWidth (in category
'initialization') -----
- defaultBorderWidth
^ 1!
Item was added:
- ----- Method: NewBalloonMorph>>defaultColor (in category
'initialization') -----
- defaultColor
^ BalloonMorph balloonColor!
Item was added:
- ----- Method: NewBalloonMorph>>drawDropShadowOn: (in category
'drawing') -----
- drawDropShadowOn: aCanvas
aCanvas
translateBy: self shadowOffset
during: [ :shadowCanvas |
(shadowCanvas isVisible: self bubbleBounds)
ifTrue: [
self wantsRoundedCorners
ifTrue: [shadowCanvas
fillRoundRect: self bubbleBounds radius: self class preferredCornerRadius fillStyle: self shadowColor]
ifFalse: [shadowCanvas
fillRectangle: self bubbleBounds fillStyle: self shadowColor]].
self hasTail ifTrue: [
shadowCanvas
drawPolygon: self
verticesForTail
fillStyle: self
shadowColor]].
- !
Item was added:
- ----- Method: NewBalloonMorph>>drawOn: (in category 'drawing') -----
- drawOn: aCanvas
"Bubble."
self wantsRoundedCorners
ifTrue: [aCanvas
frameAndFillRoundRect: self bubbleBounds
radius: self class preferredCornerRadius
fillStyle: self fillStyle borderWidth: self borderStyle width borderColor: self borderStyle color]
ifFalse: [aCanvas
fillRectangle: self bubbleBounds
fillStyle: self fillStyle borderStyle: self
borderStyle].
"Tail."
self hasTail ifTrue: [
self verticesForTail in: [:points |
| pixelOffset |
pixelOffset := points first y < points second y
ifFalse: [points first x < points second x
ifTrue: [self borderStyle width
negated @ self borderStyle width] "bottomLeft"
ifFalse: [self borderStyle width
@ self borderStyle width]] "bottomRight"
ifTrue: [points first x < points second x
ifTrue: [self borderStyle width
negated @ self borderStyle width negated] "topLeft"
ifFalse: [self borderStyle width
@ self borderStyle width negated]]. "topRight"
aCanvas
drawPolygon: points
fillStyle: self fillStyle.
aCanvas
line: points first
to: points second + pixelOffset
width: self borderStyle width
color: self borderStyle color.
aCanvas
line: points first
to: points third + pixelOffset
width: self borderStyle width
color: self borderStyle color]]!
Item was added:
- ----- Method: NewBalloonMorph>>hasTail (in category 'accessing') -----
- hasTail
^ hasTail ifNil: [true]!
Item was added:
- ----- Method: NewBalloonMorph>>hasTail: (in category 'accessing') -----
- hasTail: aBoolean
hasTail := aBoolean.!
Item was added:
- ----- Method: NewBalloonMorph>>initialize (in category
'initialization') -----
- initialize
super initialize.
self
borderWidth: self defaultBorderWidth;
borderColor: self defaultBorderColor;
color: (self defaultColor alpha: 1.0); "no alpha due to
drop shadow"
hasDropShadow: true;
shadowOffset: 1@1;
shadowColor: (self color muchDarker muchDarker alpha:
0.333);
orientation: #bottomLeft.
MenuMorph roundedMenuCorners
ifTrue: [self cornerStyle: #rounded].
textMorph := TextMorph new
wrapFlag: false;
lock;
yourself.
self addMorph: textMorph.!
Item was added:
- ----- Method: NewBalloonMorph>>maximumWidth (in category 'accessing')
- maximumWidth
^ maximumWidth ifNil: [
maximumWidth := (self balloonOwner balloonFont widthOf:
$m) * Preferences maxBalloonHelpLineLength]!
Item was added:
- ----- Method: NewBalloonMorph>>maximumWidth: (in category 'accessing')
- maximumWidth: anInteger
maximumWidth := anInteger.!
Item was added:
- ----- Method: NewBalloonMorph>>morphicLayerNumber (in category 'WiW
support') -----
- morphicLayerNumber
"helpful for insuring some morphs always appear in front of or
behind others.
smaller numbers are in front"
^5 "Balloons are very front-like things"!
Item was added:
- ----- Method: NewBalloonMorph>>move: (in category 'geometry') -----
- move: targetPoint
self perform: (self orientation, #:) asSymbol with: targetPoint.!
Item was added:
- ----- Method: NewBalloonMorph>>orientation (in category 'accessing')
- orientation
"Encodes the position of the tail. #topLeft, #topRight,
#bottomLeft, #bottomRight"
^ orientation!
Item was added:
- ----- Method: NewBalloonMorph>>orientation: (in category 'accessing')
- orientation: aSymbol
orientation := aSymbol.
self changed.!
Item was added:
- ----- Method: NewBalloonMorph>>popUpAt:forHand: (in category
'initialization') -----
- popUpAt: point forHand: aHand
"Pop up the receiver as balloon help for the given hand"
#(bottomLeft bottomRight topLeft topRight) detect:
[:nextOrientation |
self orientation: nextOrientation.
self move: point.
self bounds: (self bounds translatedToBeWithin: aHand
world bounds).
(self bounds perform: self orientation) = point] ifNone:
["Keep last try."].
aHand world addMorphFront: self.
aHand balloonHelp: self.!
Item was added:
- ----- Method: NewBalloonMorph>>popUpFor:hand: (in category
'initialization') -----
- popUpFor: aMorph hand: aHand
"Pop up the receiver as balloon help for the given hand"
self balloonOwner: aMorph.
self popUpForHand: aHand.!
Item was added:
- ----- Method: NewBalloonMorph>>popUpForHand: (in category
'initialization') -----
- popUpForHand: aHand
self popUpAt: aHand position forHand: aHand.!
Item was added:
- ----- Method: NewBalloonMorph>>setText: (in category 'initialization')
- setText: stringOrText
| text |
text := stringOrText asText.
text addAttribute: (TextFontReference toFont: (self balloonOwner
ifNil: [BalloonMorph]) balloonFont).
self textMorph wrapFlag: false.
self textMorph newContents: text.
self textMorph fullBounds.
(self maximumWidth > 0 and: [self textMorph width > self
maximumWidth])
ifTrue: [
self textMorph
wrapFlag: true;
width: self maximumWidth].
self updateLayout.!
Item was added:
- ----- Method: NewBalloonMorph>>tailHeight (in category 'geometry') -----
- tailHeight
^ 8!
Item was added:
- ----- Method: NewBalloonMorph>>tailPosition (in category 'geometry')
- tailPosition
^ self innerBounds perform: self orientation!
Item was added:
- ----- Method: NewBalloonMorph>>tailWidth (in category 'geometry') -----
- tailWidth
^ 15!
Item was added:
- ----- Method: NewBalloonMorph>>textMorph (in category 'accessing - ui')
- textMorph
^ textMorph!
Item was added:
- ----- Method: NewBalloonMorph>>updateLayout (in category 'layout') -----
- updateLayout
self textMorph fullBounds.
self extent: self textMorph extent + (2* self bubbleInset) + (0
@ (2*self tailHeight)).
self textMorph center: self center.!
Item was added:
- ----- Method: NewBalloonMorph>>verticesForTail (in category 'drawing')
- verticesForTail
| offset factorX factorY tpos bpos |
offset := 5 + (self wantsRoundedCorners
ifTrue: [self class preferredCornerRadius]
ifFalse: [0]).
tpos := self tailPosition.
factorX := tpos x < self center x ifTrue: [1] ifFalse: [-1].
factorY := tpos y > self center y ifTrue: [1] ifFalse: [-1].
bpos := self bubbleBounds perform: self orientation.
^ {
tpos.
bpos + (((offset + self tailWidth) * factorX) @ (self
borderStyle width negated * factorY)).
bpos + ((offset * factorX) @ (self borderStyle width
negated * factorY)).}!
-- best, Eliot