The Trunk: Morphic-mt.1474.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Morphic-mt.1474.mcz

commits-2
Marcel Taeumel uploaded a new version of Morphic to project The Trunk:
http://source.squeak.org/trunk/Morphic-mt.1474.mcz

==================== Summary ====================

Name: Morphic-mt.1474
Author: mt
Time: 9 January 2019, 9:00:34.991737 am
UUID: 14bd0540-84ba-480a-9878-754c07a26db5
Ancestors: Morphic-tpr.1473

Clean-up and bug fixes in resize grips. See http://forum.world.st/Please-Review-Some-updates-for-resize-grips-td5092584.html

=============== Diff against Morphic-tpr.1473 ===============

Item was changed:
+ (PackageInfo named: 'Morphic') preamble: '"Disable deprecation warnings to avoid hick-ups."
+ Deprecation showDeprecationWarnings: false.'!
- (PackageInfo named: 'Morphic') preamble: 'SimpleBorder allSubInstancesDo: [ :each |
- (each instVarNamed: #width) ifNil: [ each instVarNamed: #width put: 0 ].
- (each instVarNamed: #color) ifNil: [ each instVarNamed: #color put: Color transparent ].
- (each instVarNamed: #baseColor) ifNil: [ each instVarNamed: #baseColor put: Color transparent ] ].'!

Item was changed:
  Morph subclass: #AbstractResizerMorph
+ instanceVariableNames: 'handleColor handleInset lastMouse showHandle'
+ classVariableNames: 'GripThickness HandleLength'
- instanceVariableNames: 'dotColor handleColor lastMouse'
- classVariableNames: ''
  poolDictionaries: ''
  category: 'Morphic-Windows'!
 
  !AbstractResizerMorph commentStamp: 'jmv 1/29/2006 17:15' prior: 0!
  I am the superclass of a hierarchy of morph specialized in allowing the user to resize or rearrange windows and panes.!

Item was changed:
+ ----- Method: AbstractResizerMorph class>>gripThickness (in category 'preferences') -----
- ----- Method: AbstractResizerMorph class>>gripThickness (in category 'constants') -----
  gripThickness
  "A number in pixels that encodes the area were the user can target splitters or edge grips."
 
+ <preference: 'Grip Thickness'
+ category: 'windows'
+ description: 'A number in pixels that encodes the area were the user can target splitters or edge grips such as in application windows. Bigger grips make it easier to click on them.'
+ type: #Number>
+
+ ^ GripThickness ifNil: [4]!
- ^ 4!

Item was added:
+ ----- Method: AbstractResizerMorph class>>gripThickness: (in category 'preferences') -----
+ gripThickness: anInteger
+
+ GripThickness := anInteger.
+ Project current restoreDisplay.
+
+ self flag: #todo. "mt: Update existing grips. This is challenging because it interferes with ProportionalLayoutPolicy, which is tricky to refresh from here for arbitrary morphs."!

Item was added:
+ ----- Method: AbstractResizerMorph class>>handleLength (in category 'preferences') -----
+ handleLength
+
+ <preference: 'Handle Length'
+ category: 'windows'
+ description: 'AThe size of a grip handle if shown. Can be interpreted as width or height, depending of the resizer orientation. Does not affect the clickable area. See grip thickness for that.'
+ type: #Number>
+
+ ^ HandleLength ifNil: [25]!

Item was added:
+ ----- Method: AbstractResizerMorph class>>handleLength: (in category 'preferences') -----
+ handleLength: anInteger
+
+ HandleLength := anInteger.
+ Project current restoreDisplay.
+
+ self flag: #todo. "mt: Update existing grips. This is challenging because it interferes with ProportionalLayoutPolicy, which is tricky to refresh from here for arbitrary morphs."!

Item was removed:
- ----- Method: AbstractResizerMorph>>dotColor (in category 'as yet unclassified') -----
- dotColor
-
- ^ dotColor ifNil: [self setDefaultColors. dotColor]!

Item was changed:
  ----- Method: AbstractResizerMorph>>handleColor (in category 'accessing') -----
  handleColor
+ "Either use my handle color if set up or derive the handle color from my owner's color if I have an owner."
+
+ ^ (handleColor notNil or: [self owner isNil])
+ ifTrue: [handleColor ifNil: [Color black]]
+ ifFalse: [(self userInterfaceTheme resizerColorModifier ifNil: [ [:c | c muchDarker] ])
+ value: (self owner color isTransparent ifTrue: [Color white] ifFalse: [self owner color]) ]!
-
- ^ handleColor ifNil: [self setDefaultColors. handleColor]!

Item was added:
+ ----- Method: AbstractResizerMorph>>handleColor: (in category 'accessing') -----
+ handleColor: aColor
+
+ handleColor := aColor.
+ self changed.!

Item was added:
+ ----- Method: AbstractResizerMorph>>handleInset (in category 'accessing') -----
+ handleInset
+
+ ^ handleInset ifNil: [1]!

Item was added:
+ ----- Method: AbstractResizerMorph>>handleInset: (in category 'accessing') -----
+ handleInset: anInteger
+
+ handleInset := anInteger.
+ self changed.!

Item was removed:
- ----- Method: AbstractResizerMorph>>isCursorOverHandle (in category 'testing') -----
- isCursorOverHandle
-
- ^ true!

Item was changed:
  ----- Method: AbstractResizerMorph>>mouseDown: (in category 'event handling') -----
  mouseDown: anEvent
 
+ self referencePoint: anEvent position.!
- lastMouse := anEvent cursorPoint!

Item was changed:
  ----- Method: AbstractResizerMorph>>mouseEnter: (in category 'event handling') -----
  mouseEnter: anEvent
 
+ anEvent hand showTemporaryCursor: self resizeCursor.!
- self isCursorOverHandle ifTrue:
- [self setInverseColors.
- self changed.
- anEvent hand showTemporaryCursor: self resizeCursor]!

Item was changed:
  ----- Method: AbstractResizerMorph>>mouseLeave: (in category 'event handling') -----
  mouseLeave: anEvent
 
+ anEvent hand showTemporaryCursor: nil.!
- anEvent hand showTemporaryCursor: nil.
- self setDefaultColors.
- self changed!

Item was added:
+ ----- Method: AbstractResizerMorph>>referencePoint (in category 'accessing') -----
+ referencePoint
+
+ ^ lastMouse!

Item was changed:
  ----- Method: AbstractResizerMorph>>resizeCursor (in category 'accessing') -----
  resizeCursor
+ "The cursor shape I will set to the hand on hovering."
+
+ self subclassResponsibility.!
-
- self subclassResponsibility!

Item was changed:
+ ----- Method: AbstractResizerMorph>>setDefaultColors (in category 'initialization') -----
- ----- Method: AbstractResizerMorph>>setDefaultColors (in category 'private') -----
  setDefaultColors
 
+ "handleColor := Color lightGray lighter lighter.
+ dotColor := Color gray lighter"!
- handleColor := Color lightGray lighter lighter.
- dotColor := Color gray lighter!

Item was changed:
+ ----- Method: AbstractResizerMorph>>setInverseColors (in category 'initialization') -----
- ----- Method: AbstractResizerMorph>>setInverseColors (in category 'private') -----
  setInverseColors
 
+ "handleColor := Color lightGray.
+ dotColor := Color white"!
- handleColor := Color lightGray.
- dotColor := Color white!

Item was added:
+ ----- Method: AbstractResizerMorph>>showHandle (in category 'accessing') -----
+ showHandle
+
+ ^ showHandle ifNil: [false]!

Item was added:
+ ----- Method: AbstractResizerMorph>>showHandle: (in category 'accessing') -----
+ showHandle: aBoolean
+
+ showHandle := aBoolean.
+ self changed.!

Item was changed:
  ----- Method: BorderGripMorph>>drawOn: (in category 'drawing') -----
  drawOn: aCanvas
 
+ super drawOn: aCanvas.
+
+ self showHandle ifTrue: [
+ self orientation = #vertical ifTrue: [
+ aCanvas
+ fillRoundRect: (((self width @ (self height * 0.25 min: self class handleLength)) center: self center) insetBy: self handleInset)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor)].
+ self orientation = #horizontal ifTrue: [
+ aCanvas
+ fillRoundRect: ((((self width * 0.25 min: self class handleLength) @ self height) center: self center) insetBy: self handleInset)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor)] ].!
- "aCanvas fillRectangle: self bounds color: Color red" "for debugging"
- !

Item was added:
+ ----- Method: BorderGripMorph>>handleInset (in category 'accessing') -----
+ handleInset
+
+ ^ (handleInset notNil or: [self owner isNil])
+ ifTrue: [handleInset ifNil: [2]]
+ ifFalse: [(self owner borderWidth max: 1) * 2]!

Item was added:
+ ----- Method: BorderGripMorph>>layoutProportionallyIn: (in category 'layout') -----
+ layoutProportionallyIn: cellBounds
+
+ super layoutProportionallyIn: cellBounds.
+
+ self flag: #workaround. "mt: We cannot know that our owner has always the correct properties at this time."
+ self orientation = #vertical ifTrue: [
+ self width: self class gripThickness + (self owner borderWidth * 2)].
+ self orientation = #horizontal ifTrue: [
+ self height: self class gripThickness + (self owner borderWidth * 2)].
+ !

Item was added:
+ ----- Method: BorderGripMorph>>orientation (in category 'accessing') -----
+ orientation
+ "#vertical or #horizontal"
+
+ self subclassResponsibility.!

Item was removed:
- ----- Method: BorderGripMorph>>setDefaultColors (in category 'private') -----
- setDefaultColors!

Item was removed:
- ----- Method: BorderGripMorph>>setInverseColors (in category 'private') -----
- setInverseColors!

Item was added:
+ ----- Method: BorderGripMorph>>showHandle (in category 'accessing') -----
+ showHandle
+
+ ^ showHandle ifNil: [
+ self flag: #migration. "mt: Can be simplified with a later update."
+ (self class respondsTo: #drawEdgeResizeHandles)
+ ifTrue: [self class drawEdgeResizeHandles]
+ ifFalse: [false]]!

Item was changed:
  ----- Method: BottomGripMorph>>apply: (in category 'target resize') -----
  apply: delta
  | oldBounds |
+ oldBounds := self target bounds.
+ self target
- oldBounds := target bounds.
- target
  bounds: (oldBounds origin corner: oldBounds corner + (0 @ delta y))!

Item was changed:
  ----- Method: BottomGripMorph>>gripLayoutFrame (in category 'accessing') -----
  gripLayoutFrame
  ^ LayoutFrame
  fractions: (0 @ 1 corner: 1 @ 1)
+ offsets: (0 @ 0 corner: 0 @ 0)!
- offsets: (0 @ 0 negated corner: 0@ self defaultHeight)!

Item was added:
+ ----- Method: BottomGripMorph>>layoutProportionallyIn: (in category 'layout') -----
+ layoutProportionallyIn: cellBounds
+
+ super layoutProportionallyIn: cellBounds.
+
+ self flag: #workaround. "mt: We cannot know that our owner has always the correct new bounds at this time."
+ self bottom: owner bottom.!

Item was added:
+ ----- Method: BottomGripMorph>>orientation (in category 'accessing') -----
+ orientation
+
+ ^ #horizontal!

Item was changed:
  ----- Method: BottomLeftGripMorph>>apply: (in category 'target resize') -----
  apply: delta
  | oldBounds |
+ oldBounds := self target bounds.
+ self target
- oldBounds := target bounds.
- target
  bounds: (oldBounds origin + (delta x @ 0) corner: oldBounds corner + (0 @ delta y))!

Item was removed:
- ----- Method: BottomLeftGripMorph>>borderOffset (in category 'private') -----
- borderOffset
- |width|
- width :=SystemWindow borderWidth +1.
- ^self handleOrigin + (width @ width negated)!

Item was added:
+ ----- Method: BottomLeftGripMorph>>drawOn: (in category 'drawing') -----
+ drawOn: aCanvas
+
+ super drawOn: aCanvas.
+
+ self showHandle ifTrue: [
+ aCanvas
+ fillRoundRect: ((self topLeft + (self handleInset @ self handleInset negated) extent: self class gripThickness @ self height) insetBy: self handleInset)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor).
+ aCanvas
+ fillRoundRect: ((self bottomLeft + (self handleInset @ (self handleInset negated + self class gripThickness negated)) extent: self width @ self class gripThickness) insetBy: self handleInset)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor).]!

Item was changed:
  ----- Method: BottomLeftGripMorph>>gripLayoutFrame (in category 'accessing') -----
  gripLayoutFrame
  ^ LayoutFrame
  fractions: (0 @ 1 corner: 0 @ 1)
+ offsets: (0 @ 0 corner: 0 @ 0)!
- offsets: (self class gripThickness negated @ (self defaultHeight negated + self class gripThickness)
- corner: 0 @ 0)!

Item was removed:
- ----- Method: BottomLeftGripMorph>>handleOrigin (in category 'private') -----
- handleOrigin
- ^25@0!

Item was added:
+ ----- Method: BottomLeftGripMorph>>layoutProportionallyIn: (in category 'layout') -----
+ layoutProportionallyIn: cellBounds
+
+ self flag: #workaround. "mt: We cannot know that our owner has always the correct new bounds at this time."
+ self bottomLeft: owner bottomLeft.!

Item was changed:
  ----- Method: BottomRightGripMorph>>apply: (in category 'target resize') -----
  apply: delta
  | oldBounds |
+ oldBounds := self target bounds.
+ self target
- oldBounds := target bounds.
- target
  bounds: (oldBounds origin corner: oldBounds corner + delta)!

Item was removed:
- ----- Method: BottomRightGripMorph>>borderOffset (in category 'private') -----
- borderOffset
- |width|
- width :=SystemWindow borderWidth +1.
- ^self handleOrigin - (width asPoint)!

Item was added:
+ ----- Method: BottomRightGripMorph>>drawOn: (in category 'drawing') -----
+ drawOn: aCanvas
+
+ super drawOn: aCanvas.
+
+ self showHandle ifTrue: [
+ aCanvas
+ fillRoundRect: ((self topRight + ((self handleInset negated + self class gripThickness negated) @ self handleInset negated) extent: self class gripThickness @ self height) insetBy: self handleInset)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor).
+ aCanvas
+ fillRoundRect: ((self bottomLeft + (self handleInset negated @ (self handleInset negated + self class gripThickness negated)) extent: self width @ self class gripThickness) insetBy: self handleInset)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor).]!

Item was changed:
  ----- Method: BottomRightGripMorph>>gripLayoutFrame (in category 'accessing') -----
  gripLayoutFrame
  ^ LayoutFrame
  fractions: (1 @ 1 corner: 1 @ 1)
+ offsets: (0 @ 0 corner: 0 @ 0)!
- offsets: ((self defaultWidth negated + self class gripThickness) @ (self defaultHeight negated + self class gripThickness)
- corner: 0@0)!

Item was removed:
- ----- Method: BottomRightGripMorph>>handleOrigin (in category 'private') -----
- handleOrigin
- ^0@0!

Item was added:
+ ----- Method: BottomRightGripMorph>>layoutProportionallyIn: (in category 'layout') -----
+ layoutProportionallyIn: cellBounds
+
+ self flag: #workaround. "mt: We cannot know that our owner has always the correct new bounds at this time."
+ self bottomRight: owner bottomRight.!

Item was changed:
  AbstractResizerMorph subclass: #CornerGripMorph
  instanceVariableNames: 'target'
+ classVariableNames: 'DrawCornerResizeHandles DrawEdgeResizeHandles'
- classVariableNames: 'ActiveForm DrawCornerResizeHandles PassiveForm'
  poolDictionaries: ''
  category: 'Morphic-Windows'!
 
  !CornerGripMorph commentStamp: 'jmv 1/29/2006 17:15' prior: 0!
  I am the superclass of a hierarchy of morph specialized in allowing the user to resize windows.!

Item was removed:
- ----- Method: CornerGripMorph class>>activeColor (in category 'handle settings') -----
- activeColor
- <preference: 'Corner Grip highlight color'
- category: 'colors'
- description: 'The highlight-color of window corners'
- type: #Color>
- ^(self activeForm colorAt: 24@24) alpha:  1!

Item was removed:
- ----- Method: CornerGripMorph class>>activeColor: (in category 'handle settings') -----
- activeColor: aColor
- |canvas|
- canvas := self initializeActiveForm getCanvas.
- canvas
- privatePort fillPattern: aColor;
- combinationRule: Form rgbMul;
- fillRect: (self activeForm boundingBox) offset: 0@0.
-
- !

Item was removed:
- ----- Method: CornerGripMorph class>>activeForm (in category 'accessing') -----
- activeForm
- ^ActiveForm ifNil: [self initializeActiveForm]!

Item was removed:
- ----- Method: CornerGripMorph class>>defaultForm (in category 'class initialization') -----
(excessive size, no diff calculated)

Item was removed:
- ----- Method: CornerGripMorph class>>defaultFormFromFileNamed: (in category 'handle settings') -----
- defaultFormFromFileNamed: aString
- "If you dislike the alpha scale of the default handle, use this method to install a new one.
- File should be in a readable image format, and contain a 48x48 32bit radial gradient with color white.
- Use passiveColor: / activeColor: to change them after file is loaded, see initialize for an example"
-
- |sourceStream|
- sourceStream := WriteStream on: String new.
- sourceStream nextPutAll: 'defaultForm';
- nextPut: Character cr;
- nextPut: Character cr;
- nextPut: $^;
- nextPut: $(;
- nextPutAll: (ImageReadWriter formFromFileNamed: aString) storeString;
- nextPut: $).
- self class compile: sourceStream contents.!

Item was added:
+ ----- Method: CornerGripMorph class>>drawEdgeResizeHandles (in category 'preferences') -----
+ drawEdgeResizeHandles
+ <preference: 'Draw Edge Resize Handles'
+ category: 'windows'
+ description: 'Set whether the resize handles on windows should be drawn on the window frame. This does not enable nor disable the resizing function.'
+ type: #Boolean>
+ ^ DrawEdgeResizeHandles ifNil: [ false ]!

Item was added:
+ ----- Method: CornerGripMorph class>>drawEdgeResizeHandles: (in category 'preferences') -----
+ drawEdgeResizeHandles: aBoolean
+
+ DrawEdgeResizeHandles := aBoolean.
+ Project current restoreDisplay.!

Item was removed:
- ----- Method: CornerGripMorph class>>initialize (in category 'class initialization') -----
- initialize
- "CornerGripMorph initialize"
-
- super initialize.
- self initializeActiveForm.
- self initializePassiveForm.
- self activeColor: Color orange.!

Item was removed:
- ----- Method: CornerGripMorph class>>initializeActiveForm (in category 'class initialization') -----
- initializeActiveForm
-
- ^ActiveForm := self defaultForm!

Item was removed:
- ----- Method: CornerGripMorph class>>initializePassiveForm (in category 'class initialization') -----
- initializePassiveForm
-
- ^PassiveForm := self defaultForm!

Item was removed:
- ----- Method: CornerGripMorph class>>passiveColor (in category 'handle settings') -----
- passiveColor
- <preference: 'Corner Grip color'
- category: 'colors'
- description: 'The default color of window corners'
- type: #Color>
- ^(self passiveForm colorAt: 24@24) alpha:  1!

Item was removed:
- ----- Method: CornerGripMorph class>>passiveColor: (in category 'handle settings') -----
- passiveColor: aColor
- | canvas |
- canvas := self initializePassiveForm getCanvas.
- canvas privatePort fillPattern: aColor;
- combinationRule: Form rgbMul;
- fillRect: self passiveForm boundingBox offset: 0 @ 0.
- self
- allSubInstancesDo: [:each | each setDefaultColors; changed]!

Item was removed:
- ----- Method: CornerGripMorph class>>passiveForm (in category 'accessing') -----
- passiveForm
- ^PassiveForm ifNil: [self initializePassiveForm]!

Item was removed:
- ----- Method: CornerGripMorph>>activeForm (in category 'private') -----
- activeForm
- ^self clipForm: self class activeForm!

Item was removed:
- ----- Method: CornerGripMorph>>alphaHandle (in category 'drawing') -----
- alphaHandle
-
- handleColor ifNil: [handleColor := self passiveForm].
- "The following line is only needed on first load, so existing windows don't blow up from the new handles.
- Can safely be deleted along with this comment in a later update"
- (handleColor class == Form)
- ifFalse: [handleColor := self passiveForm].
- ^handleColor
-
-
- !

Item was removed:
- ----- Method: CornerGripMorph>>borderOffset (in category 'private') -----
- borderOffset
- "The offset from my corner to where the border starts"
- ^self subclassResponsibility!

Item was removed:
- ----- Method: CornerGripMorph>>clipForm: (in category 'private') -----
- clipForm: aHandle
- |cutArea|
- "This doesn't really needs to be done every draw, but only if border width changes.
- In that case,, we'd have to install a newly initialized one anyways, so the current method will fail.
- Good enough for now though."
- cutArea := self transparentRectangle.
- aHandle getCanvas image: cutArea
- at: self borderOffset
- sourceRect: cutArea boundingBox
- rule: Form and.
- ^aHandle
-
- !

Item was changed:
  ----- Method: CornerGripMorph>>defaultHeight (in category 'accessing') -----
  defaultHeight
 
+ ^ self class handleLength!
- ^ self class gripThickness * 6!

Item was changed:
  ----- Method: CornerGripMorph>>defaultWidth (in category 'accessing') -----
  defaultWidth
 
+ ^ self class handleLength!
- ^ self class gripThickness * 6!

Item was changed:
  ----- Method: CornerGripMorph>>drawOn: (in category 'drawing') -----
  drawOn: aCanvas
 
+ "self showHandle
- self drawCornerResizeHandles
  ifTrue: [
  bounds := self bounds.
  aCanvas
+ translucentImage: self alphaHandle
+ at: self topLeft
+ sourceRect: (self handleOrigin + (1@1) extent: self extent)]"!
- translucentImage: (self alphaHandle)
- at: (bounds origin )
- sourceRect: (self handleOrigin extent: bounds extent)]!

Item was added:
+ ----- Method: CornerGripMorph>>handleInset (in category 'accessing') -----
+ handleInset
+
+ ^ (handleInset notNil or: [self owner isNil])
+ ifTrue: [handleInset ifNil: [1]]
+ ifFalse: [self owner borderWidth max: 1]!

Item was removed:
- ----- Method: CornerGripMorph>>handleOrigin (in category 'private') -----
- handleOrigin
- "The handles origin is the offset into the alphaForm"
- ^self subclassResponsibility!

Item was changed:
  ----- Method: CornerGripMorph>>initialize (in category 'initialization') -----
  initialize
+
  super initialize.
+ self extent: self defaultWidth @ self defaultHeight.
+ self layoutFrame: self gripLayoutFrame.!
- self extent: self defaultWidth+2 @ (self defaultHeight+2).
- self layoutFrame: self gripLayoutFrame!

Item was changed:
  ----- Method: CornerGripMorph>>mouseDown: (in category 'event handling') -----
  mouseDown: anEvent
+ "Disable drop shadow to improve performance while resizing."
- "Disable drop shadow to improve performance."
 
  super mouseDown: anEvent.
 
+ self target ifNil: [^ self].
+ self target fastFramingOn ifFalse: [
- target ifNil: [^ self].
- target fastFramingOn ifFalse: [
  self setProperty: #targetHadDropShadow toValue: target hasDropShadow.
+ self target hasDropShadow: false].!
- target hasDropShadow: false].!

Item was changed:
  ----- Method: CornerGripMorph>>mouseMove: (in category 'event handling') -----
  mouseMove: anEvent
+
  | delta |
+ self target ifNil: [^ self].
+ self target fastFramingOn
+ ifTrue: [delta := self target doFastWindowReframe: self ptName]
- target ifNil: [^ self].
- target fastFramingOn
- ifTrue: [delta := target doFastWindowReframe: self ptName]
  ifFalse: [
+ delta := self referencePoint ifNil: [0@0] ifNotNil: [anEvent position - self referencePoint].
+ self referencePoint: anEvent position.
- delta := lastMouse ifNil: [0@0] ifNotNil: [anEvent cursorPoint - lastMouse].
- lastMouse := anEvent cursorPoint.
  self apply: delta.
  self bounds: (self bounds origin + delta extent: self bounds extent)].!

Item was changed:
  ----- Method: CornerGripMorph>>mouseUp: (in category 'event handling') -----
  mouseUp: anEvent
+ "Restore target drop shadow if there was one. See #mouseDown:."
+
+ self target ifNil: [^ self].
+ self target fastFramingOn ifFalse: [
+ (self valueOfProperty: #targetHadDropShadow ifAbsent: [false]) ifTrue: [self target hasDropShadow: true].
-
- target ifNil: [^ self].
- target fastFramingOn ifFalse: [
- (self valueOfProperty: #targetHadDropShadow ifAbsent: [false]) ifTrue: [target hasDropShadow: true].
  self removeProperty: #targetHadDropShadow].!

Item was removed:
- ----- Method: CornerGripMorph>>passiveForm (in category 'private') -----
- passiveForm
- ^self clipForm: self class passiveForm!

Item was removed:
- ----- Method: CornerGripMorph>>setDefaultColors (in category 'private') -----
- setDefaultColors
-
- handleColor := self passiveForm.!

Item was removed:
- ----- Method: CornerGripMorph>>setInverseColors (in category 'private') -----
- setInverseColors
- handleColor := self activeForm.!

Item was added:
+ ----- Method: CornerGripMorph>>showHandle (in category 'accessing') -----
+ showHandle
+
+ ^ showHandle ifNil: [self class drawCornerResizeHandles]!

Item was added:
+ ----- Method: CornerGripMorph>>target (in category 'accessing') -----
+ target
+
+ ^ target!

Item was changed:
+ ----- Method: CornerGripMorph>>target: (in category 'accessing') -----
- ----- Method: CornerGripMorph>>target: (in category 'accessing-backstop') -----
  target: aMorph
 
  target := aMorph!

Item was removed:
- ----- Method: CornerGripMorph>>transparentRectangle (in category 'private') -----
- transparentRectangle
- "This could be a class var, provided either bounds of grips does not change, or one ensures a new one is installed when such an event occurs"
- ^Form extent: self bounds extent depth: 32!

Item was changed:
  ----- Method: FillInTheBlankMorph>>setQuery:initialAnswer:answerExtent:acceptOnCR: (in category 'initialization') -----
  setQuery: queryString initialAnswer: initialAnswer answerExtent: answerExtent acceptOnCR: acceptBoolean
 
  | text |
 
  result := initialAnswer.
  done := false.
 
  self paneMorph removeAllMorphs.
 
  self title: 'Input Requested' translated.
  self message: queryString.
 
  text := self createTextPaneAcceptOnCR: acceptBoolean.
  self paneMorph addMorphBack: text.
 
  self paneMorph
  wantsPaneSplitters: true;
  addCornerGrips.
+ self paneMorph grips do: [:ea | ea showHandle: true].
- self paneMorph grips do: [:ea | ea drawCornerResizeHandles: true].
 
  self paneMorph extent: ((initialAnswer asText asMorph extent + (20@10) max: answerExtent) min: 500@500).
  self setDefaultParameters.!

Item was changed:
  ----- Method: LeftGripMorph>>apply: (in category 'target resize') -----
  apply: delta
  | oldBounds |
+ oldBounds := self target bounds.
+ self target
- oldBounds := target bounds.
- target
  bounds: (oldBounds origin + (delta x @ 0) corner: oldBounds corner)!

Item was changed:
  ----- Method: LeftGripMorph>>gripLayoutFrame (in category 'accessing') -----
  gripLayoutFrame
  ^ LayoutFrame
  fractions: (0 @ 0 corner: 0 @ 1)
+ offsets: (0 @ 0 corner: 0 @ 0)!
- offsets: (self defaultWidth negated @ 0 corner: 0 @ 0)!

Item was added:
+ ----- Method: LeftGripMorph>>layoutProportionallyIn: (in category 'layout') -----
+ layoutProportionallyIn: cellBounds
+
+ super layoutProportionallyIn: cellBounds.
+
+ self flag: #workaround. "mt: We cannot know that our owner has always the correct new bounds at this time."
+ self left: owner left.
+
+ self top: owner top.
+ self height: owner height.!

Item was added:
+ ----- Method: LeftGripMorph>>orientation (in category 'accessing') -----
+ orientation
+
+ ^ #vertical!

Item was changed:
  AbstractResizerMorph subclass: #ProportionalSplitterMorph
+ instanceVariableNames: 'leftOrTop rightOrBottom splitsTopAndBottom traceMorph movements'
- instanceVariableNames: 'leftOrTop rightOrBottom splitsTopAndBottom oldColor traceMorph handle movements'
  classVariableNames: 'SmartHorizontalSplitters SmartVerticalSplitters'
  poolDictionaries: ''
  category: 'Morphic-Windows'!
 
  !ProportionalSplitterMorph commentStamp: 'jmv 1/29/2006 17:16' prior: 0!
  I am the morph the user grabs to adjust pane splitters.!

Item was changed:
  ----- Method: ProportionalSplitterMorph class>>fastSplitterResize (in category 'preferences') -----
  fastSplitterResize
 
+ ^ Preferences fastDragWindowForMorphic!
- ^ Preferences fastDragWindowForMorphic.!

Item was added:
+ ----- Method: ProportionalSplitterMorph class>>showSplitterHandles: (in category 'preferences') -----
+ showSplitterHandles: aBoolean
+
+ Preferences setPreference: #showSplitterHandles toValue: aBoolean.
+ Project current restoreDisplay.!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>addLeftOrTop: (in category 'initialization') -----
- ----- Method: ProportionalSplitterMorph>>addLeftOrTop: (in category 'controlled morphs') -----
  addLeftOrTop: aMorph
 
  leftOrTop add: aMorph!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>addRightOrBottom: (in category 'initialization') -----
- ----- Method: ProportionalSplitterMorph>>addRightOrBottom: (in category 'controlled morphs') -----
  addRightOrBottom: aMorph
 
  rightOrBottom add: aMorph.
 
  !

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>balanceOffsets (in category 'events') -----
- ----- Method: ProportionalSplitterMorph>>balanceOffsets (in category 'layout') -----
  balanceOffsets
 
  | fdx fdy |
 
  (self hasProperty: #fullDelta) ifFalse: [^ self].
 
  fdx := (self valueOfProperty: #fullDelta) x.
  fdy := (self valueOfProperty: #fullDelta) y.
 
  self layoutFrame hasFixedHeight ifTrue: [
  | otop obot ctop cbot topf |
 
  otop := (owner submorphs detect: [:m |
  m layoutFrame topFraction isZero] ifNone: [^ self]) in: [:tm |
  tm top - (tm layoutFrame topOffset ifNil: [0])].
 
  obot := (owner submorphs detect: [:m |
  m layoutFrame bottomFraction = 1] ifNone: [^ self]) in: [:tm |
  tm bottom - (tm layoutFrame bottomOffset ifNil: [0])].
 
  ctop := (self layoutFrame topFraction * (obot - otop)) rounded
  + otop + (self layoutFrame topOffset ifNil: [0]).
  cbot := (self layoutFrame bottomFraction * (obot - otop)) rounded
  + otop + (self layoutFrame bottomOffset ifNil: [0]).
 
  topf := self layoutFrame topFraction.
  self layoutFrame topFraction:  ((ctop + cbot) * 0.5 - otop) / (obot - otop) asFloat.
  self layoutFrame bottomFraction: self layoutFrame topFraction.
  self layoutFrame topOffset: self layoutFrame topOffset - fdy.
  self layoutFrame bottomOffset: self layoutFrame bottomOffset - fdy.
 
  (leftOrTop copy union: rightOrBottom) do: [:m |
  (m layoutFrame topFraction closeTo: topf) ifTrue: [
  m layoutFrame topFraction: self layoutFrame topFraction.
  m layoutFrame topOffset: m layoutFrame topOffset - fdy].
  (m layoutFrame bottomFraction closeTo: topf) ifTrue: [
  m layoutFrame bottomFraction: self layoutFrame topFraction.
  m layoutFrame bottomOffset: m layoutFrame bottomOffset - fdy]]] .
 
  self layoutFrame hasFixedWidth ifTrue: [
  | oleft oright cleft cright leftf |
 
  oleft := (owner submorphs detect: [:m |
  m layoutFrame leftFraction isZero] ifNone: [^ self]) in: [:tm |
  tm left - (tm layoutFrame leftOffset ifNil: [0])].
 
  oright := (owner submorphs detect: [:m |
  m layoutFrame rightFraction = 1] ifNone: [^ self]) in: [:tm |
  tm right - (tm layoutFrame rightOffset ifNil: [0])].
 
  cleft := (self layoutFrame leftFraction * (oright - oleft)) rounded
  + oleft + (self layoutFrame leftOffset ifNil: [0]).
  cright := (self layoutFrame rightFraction * (oright - oleft)) rounded
  + oleft + (self layoutFrame rightOffset ifNil: [0]).
 
  leftf := self layoutFrame leftFraction.
  self layoutFrame leftFraction: ((cleft + cright) * 0.5 - oleft) / (oright - oleft) asFloat.
  self layoutFrame rightFraction: self layoutFrame leftFraction.
 
 
  self layoutFrame leftOffset: self layoutFrame leftOffset - fdx.
  self layoutFrame rightOffset: self layoutFrame rightOffset - fdx.
 
  (leftOrTop copy union: rightOrBottom) do: [:m |
  (m layoutFrame leftFraction closeTo: leftf) ifTrue: [
  m layoutFrame leftFraction: self layoutFrame leftFraction.
  m layoutFrame leftOffset: m layoutFrame leftOffset - fdx].
  (m layoutFrame rightFraction closeTo: leftf) ifTrue: [
  m layoutFrame rightFraction: self layoutFrame leftFraction.
  m layoutFrame rightOffset: m layoutFrame rightOffset - fdx.]]] .
 
  self removeProperty: #fullDelta.
  owner layoutChanged
  !

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>beSplitsLeftAndRight (in category 'initialization') -----
- ----- Method: ProportionalSplitterMorph>>beSplitsLeftAndRight (in category 'direction') -----
  beSplitsLeftAndRight
 
  splitsTopAndBottom := false.
  self
  hResizing: #rigid;
  vResizing: #spaceFill.
  self width: self class gripThickness.!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>beSplitsTopAndBottom (in category 'initialization') -----
- ----- Method: ProportionalSplitterMorph>>beSplitsTopAndBottom (in category 'direction') -----
  beSplitsTopAndBottom
 
  splitsTopAndBottom := true.
  self
  vResizing: #rigid;
  hResizing: #spaceFill.
  self height: self class gripThickness.!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>bordersOn: (in category 'queries - controlled morphs') -----
- ----- Method: ProportionalSplitterMorph>>bordersOn: (in category 'controlled morphs') -----
  bordersOn: aMorph
  "Answer true if the aMorph is one of my neighbours."
 
  ^ (leftOrTop includes: aMorph) or: [rightOrBottom includes: aMorph]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>bottomBoundary (in category 'queries - geometry') -----
- ----- Method: ProportionalSplitterMorph>>bottomBoundary (in category 'boundaries') -----
  bottomBoundary
  "Answert the bottommost x position the receiver could be moved."
 
  | splitter morphs |
  splitter := self splitterBelow.
  morphs := self commonNeighbours: rightOrBottom with: splitter.
  ^ (splitter
  ifNil: [owner isSystemWindow ifTrue: [owner panelRect bottom]
  ifFalse: [owner innerBounds bottom]]
  ifNotNil: [splitter top])
  - (self minimumHeightOf: morphs)!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>canEncroachWhiteSpaceOf: (in category 'smart splitters - queries') -----
- ----- Method: ProportionalSplitterMorph>>canEncroachWhiteSpaceOf: (in category 'layout') -----
  canEncroachWhiteSpaceOf: morphs
  ^ morphs allSatisfy: [ : each | each canBeEncroached ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>charactersOccludedIn: (in category 'smart splitters - queries') -----
- ----- Method: ProportionalSplitterMorph>>charactersOccludedIn: (in category 'layout') -----
  charactersOccludedIn: aCollection
  ^ aCollection
  inject: 0
  into:
  [ : sum : each | sum +
  (each isMorphicModel
  ifTrue: [ each charactersOccluded ]
  ifFalse: [ 0 ]) ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>commonNeighbours:with: (in category 'queries - controlled morphs') -----
- ----- Method: ProportionalSplitterMorph>>commonNeighbours:with: (in category 'controlled morphs') -----
  commonNeighbours: morphs with: aProportionalSplitterMorphOrNil
  "Answer the subset of morphs which is also confined by aProportionalSplitterMorphOrNil."
 
  ^ aProportionalSplitterMorphOrNil isNil
  ifTrue: [morphs]
  ifFalse: [morphs select: [ :which |
  aProportionalSplitterMorphOrNil bordersOn: which]]!

Item was added:
+ ----- Method: ProportionalSplitterMorph>>drawOn: (in category 'drawing') -----
+ drawOn: aCanvas
+
+ super drawOn: aCanvas.
+
+ self showHandle ifTrue: [
+ self splitsLeftAndRight ifTrue: [
+ aCanvas
+ fillRoundRect: (((self width - (self handleInset * 2) max: 1) @ (self height * 0.25 min: self class handleLength)) center: self center)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor)].
+ self splitsTopAndBottom ifTrue: [
+ aCanvas
+ fillRoundRect: (((self width * 0.25 min: self class handleLength) @ (self height - (self handleInset * 2) max: 1)) center: self center)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor)] ].!

Item was removed:
- ----- Method: ProportionalSplitterMorph>>getOldColor (in category 'displaying') -----
- getOldColor
- ^ oldColor ifNil: [Color transparent]!

Item was removed:
- ----- Method: ProportionalSplitterMorph>>handleRect (in category 'displaying') -----
- handleRect
-
- ^ Rectangle
- center: self bounds center
- extent: (self splitsTopAndBottom
- ifTrue: [self handleSize transposed]
- ifFalse: [self handleSize])!

Item was removed:
- ----- Method: ProportionalSplitterMorph>>handleSize (in category 'displaying') -----
- handleSize
-
- ^ self class gripThickness @ 30!

Item was changed:
  ----- Method: ProportionalSplitterMorph>>initialize (in category 'initialization') -----
  initialize
 
  super initialize.
 
  self beSplitsLeftAndRight.
 
  leftOrTop := OrderedCollection new.
  rightOrBottom := OrderedCollection new.
 
+ self initializeMovements.!
- Preferences showSplitterHandles
- ifTrue: [
- handle := CircleMorph new
- borderWidth: 0;
- extent: 4@4;
- yourself.
- handle fillStyle: ((GradientFillStyle
- ramp: {0.0 -> Color veryVeryLightGray muchLighter.
- 1.0 -> Color veryVeryLightGray darker})
- origin: handle topLeft;
- direction: 0 @ handle bounds extent y;
- normal: handle bounds extent x @ 0;
- radial: false;
- yourself).
- self addMorphCentered: handle].
- self initializeMovements!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>initializeMovements (in category 'smart splitters') -----
- ----- Method: ProportionalSplitterMorph>>initializeMovements (in category 'initialization') -----
  initializeMovements
  movements := OrderedCollection new: 3 withAll: 0!

Item was removed:
- ----- Method: ProportionalSplitterMorph>>isCursorOverHandle (in category 'testing') -----
- isCursorOverHandle
- ^ self class showSplitterHandles not or: [self handleRect containsPoint: ActiveHand cursorPoint]!

Item was removed:
- ----- Method: ProportionalSplitterMorph>>layoutChanged (in category 'layout') -----
- layoutChanged
-
- super layoutChanged.
- handle ifNotNil: [handle position: self bounds center - (2@2)]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>leftBoundary (in category 'queries - geometry') -----
- ----- Method: ProportionalSplitterMorph>>leftBoundary (in category 'boundaries') -----
  leftBoundary
  "Answer the leftmost y position the receiver could be moved."
 
  | splitter morphs |
  splitter := self splitterLeft.
  morphs := self commonNeighbours: leftOrTop with: splitter.
  ^ (splitter
  ifNil: [owner isSystemWindow ifTrue: [owner panelRect left]
  ifFalse: [owner innerBounds left]]
  ifNotNil: [splitter right])
  + (self minimumWidthOf: morphs)!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>leftRightImbalance (in category 'smart splitters - queries') -----
- ----- Method: ProportionalSplitterMorph>>leftRightImbalance (in category 'layout') -----
  leftRightImbalance
  "First check if I find myself out of range due to user having reduced size of parent."
  ^ self left < self leftBoundary "too far left"
  ifTrue: [ self leftBoundary-self left ]
  ifFalse:
  [ self right > self rightBoundary "too far right"
  ifTrue: [ self rightBoundary-self right ]
  ifFalse: [ self occlusionDifference ] ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>minimumHeightOf: (in category 'queries - geometry') -----
- ----- Method: ProportionalSplitterMorph>>minimumHeightOf: (in category 'boundaries') -----
  minimumHeightOf: aCollection
  "Answer the minimum height needed to display any of the morphs in aCollection.
  See ProportionalLayout >> #minExtentOf:in:."
 
  ^ aCollection inject: 0 into: [ :height :morph |
  | minHeight |
  minHeight := morph minHeight.
  "morph layoutFrame ifNotNil: [:frame |
  minHeight := frame minHeightFrom: minHeight]."
  minHeight + self height max: height]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>minimumWidthOf: (in category 'queries - geometry') -----
- ----- Method: ProportionalSplitterMorph>>minimumWidthOf: (in category 'boundaries') -----
  minimumWidthOf: aCollection
  "Answer the minimum width needed to display any of the morphs in aCollection.
  See ProportionalLayout >> #minExtentOf:in:."
 
  ^ aCollection inject: 0 into: [ :width :morph |
  | minWidth |
  minWidth := morph minWidth.
  "morph layoutFrame ifNotNil: [:frame |
  minWidth := frame minWidthFrom: minWidth]."
  minWidth + self width max: width]!

Item was changed:
  ----- Method: ProportionalSplitterMorph>>mouseDown: (in category 'events') -----
  mouseDown: anEvent
  "If the user manually drags me, don't override him with auto positioning."
 
  self setProperty: #fullDelta toValue: 0@0.
 
  anEvent redButtonChanged
  ifTrue: [ self withSiblingSplittersDo: [ : each | each stopStepping ] ]
  ifFalse:
  [ anEvent shiftPressed
  ifTrue: [ self startStepping ]
  ifFalse:
  [ self startStepping.
  self withSiblingSplittersDo: [ : each | each startStepping ] ] ].
+
- (self class showSplitterHandles not and: [ self bounds containsPoint: anEvent cursorPoint ]) ifTrue:
- [ oldColor := self color.
- self color: Color black ].
  ^ super mouseDown: anEvent!

Item was changed:
  ----- Method: ProportionalSplitterMorph>>mouseUp: (in category 'events') -----
  mouseUp: anEvent
  (self bounds containsPoint: anEvent cursorPoint) ifFalse: [ anEvent hand showTemporaryCursor: nil ].
  self class fastSplitterResize ifTrue: [ self updateFromEvent: anEvent ].
  traceMorph ifNotNil:
  [ traceMorph delete.
  traceMorph := nil ].
+
- self color: self getOldColor.
  "balanceOffsets currently disrupts Smart Splitter behavior."
  (ProportionalSplitterMorph smartVerticalSplitters or: [ ProportionalSplitterMorph smartHorizontalSplitters ]) ifFalse: [ self balanceOffsets ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>movements (in category 'smart splitters') -----
- ----- Method: ProportionalSplitterMorph>>movements (in category 'layout') -----
  movements
  "Used to track my pattern of movement for the last 3 steps to fix the twitching."
  "Lazy-init for now for smooth transition -- want to convert this back to direct-var access after a few months."
  ^ movements ifNil: [ self initializeMovements. movements ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>normalizedX: (in category 'queries - geometry') -----
- ----- Method: ProportionalSplitterMorph>>normalizedX: (in category 'boundaries') -----
  normalizedX: x
 
  ^ (x max: self leftBoundary) min: self rightBoundary!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>normalizedY: (in category 'queries - geometry') -----
- ----- Method: ProportionalSplitterMorph>>normalizedY: (in category 'boundaries') -----
  normalizedY: y
 
  ^ (y max: self topBoundary) min: self bottomBoundary!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>occlusionDifference (in category 'smart splitters - queries') -----
- ----- Method: ProportionalSplitterMorph>>occlusionDifference (in category 'events') -----
  occlusionDifference
  ^ (self charactersOccludedIn: leftOrTop) - (self charactersOccludedIn: rightOrBottom)!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>proposedCorrectionWouldCauseFocusChange: (in category 'smart splitters - queries') -----
- ----- Method: ProportionalSplitterMorph>>proposedCorrectionWouldCauseFocusChange: (in category 'layout') -----
  proposedCorrectionWouldCauseFocusChange: correction
  ^ Preferences mouseOverForKeyboardFocus and:
  [ | edge | splitsTopAndBottom
  ifTrue:
  [ edge := correction positive
  ifTrue: [ self bottom + 3 ]
  ifFalse: [ self top - 3 ].
  self activeHand position y
  inRangeOf: edge
  and: edge + correction ]
  ifFalse:
  [ edge := correction positive
  ifTrue: [ self right ]
  ifFalse: [ self left ].
  self activeHand position x
  inRangeOf: edge
  and: edge + correction ] ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>reduceLeftRightImbalance (in category 'smart splitters') -----
- ----- Method: ProportionalSplitterMorph>>reduceLeftRightImbalance (in category 'layout') -----
  reduceLeftRightImbalance
  | correction |
  correction := self leftRightImbalance.
  correction abs > 1
  ifTrue:
  [ (self proposedCorrectionWouldCauseFocusChange: correction) ifFalse:
  [ self repositionBy:
  (correction abs > 4
  ifTrue: [ correction sign * 2 @ 0 ]
  ifFalse: [ correction sign @ 0 ]) ] ]
  ifFalse:
  [ self class smartVerticalSplitters ifFalse: [ self stopStepping ] ].
  ^ correction!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>reduceTopBottomImbalance (in category 'smart splitters') -----
- ----- Method: ProportionalSplitterMorph>>reduceTopBottomImbalance (in category 'layout') -----
  reduceTopBottomImbalance
  | correction |
  (correction := self topBottomCorrection) isZero
  ifTrue:
  [ self class smartHorizontalSplitters ifFalse: [ self stopStepping ] ]
  ifFalse:
  [ (self proposedCorrectionWouldCauseFocusChange: correction) ifFalse: [ self repositionBy: 0 @ correction ] ].
  ^ correction!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>repositionBy: (in category 'events') -----
- ----- Method: ProportionalSplitterMorph>>repositionBy: (in category 'layout') -----
  repositionBy: delta
  | selfTop selfBottom selfLeft selfRight |
 
  self setProperty: #fullDelta toValue: ((self valueOfProperty: #fullDelta) ifNil: [0@0]) + delta.
 
  leftOrTop do:
  [ : each | | firstRight firstBottom firstLeft firstTop |
  firstRight := each layoutFrame rightOffset ifNil: [ 0 ].
  firstBottom := each layoutFrame bottomOffset ifNil: [ 0 ].
  each layoutFrame rightOffset: firstRight + delta x.
  each layoutFrame bottomOffset: firstBottom + delta y.
  each layoutFrame hasFixedHeight ifTrue: [
  firstTop := each layoutFrame topOffset ifNil: [ 0 ].
  each layoutFrame topOffset: firstTop + delta y ].
  each layoutFrame hasFixedWidth ifTrue: [
  firstLeft := each layoutFrame leftOffset ifNil: [ 0 ].
  each layoutFrame leftOffset: firstLeft + delta x. ] ].
  rightOrBottom do:
  [ : each | | secondLeft secondTop secondRight secondBottom |
  secondLeft := each layoutFrame leftOffset ifNil: [ 0 ].
  secondTop := each layoutFrame topOffset ifNil: [ 0 ].
  each layoutFrame leftOffset: secondLeft + delta x.
  each layoutFrame topOffset: secondTop + delta y.
  each layoutFrame hasFixedHeight ifTrue: [
  secondBottom := each layoutFrame bottomOffset ifNil: [ 0 ].
  each layoutFrame bottomOffset: secondBottom + delta y. ].
  each layoutFrame hasFixedWidth ifTrue: [
  secondRight := each layoutFrame rightOffset ifNil: [ 0 ].
  each layoutFrame rightOffset: secondRight + delta x. ] ].
 
  selfTop := self layoutFrame topOffset ifNil: [ 0 ].
  selfBottom := self layoutFrame bottomOffset ifNil: [ 0 ].
  selfLeft := self layoutFrame leftOffset ifNil: [ 0 ].
  selfRight := self layoutFrame rightOffset ifNil: [ 0 ].
  self layoutFrame
  topOffset: selfTop + delta y ;
  bottomOffset: selfBottom + delta y ;
  leftOffset: selfLeft + delta x ;
  rightOffset: selfRight + delta x.
  self owner layoutChanged.
  self movements removeFirst; add: (splitsTopAndBottom ifTrue: [ delta y sign ] ifFalse: [ delta x sign ])!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>resizeCursor (in category 'accessing') -----
- ----- Method: ProportionalSplitterMorph>>resizeCursor (in category 'displaying') -----
  resizeCursor
 
  ^ Cursor resizeForEdge: (splitsTopAndBottom
  ifTrue: [#top]
  ifFalse: [#left])
  !

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>rightBoundary (in category 'queries - geometry') -----
- ----- Method: ProportionalSplitterMorph>>rightBoundary (in category 'boundaries') -----
  rightBoundary
  "Answer the rightmost x position the receiver could be moved to."
 
  | splitter morphs |
  splitter := self splitterRight.
  morphs := self commonNeighbours: rightOrBottom with: splitter.
 
  ^ (splitter
  ifNil: [owner isSystemWindow ifTrue: [owner panelRect right]
  ifFalse: [owner innerBounds right]]
  ifNotNil: [splitter left])
  - (self minimumWidthOf: morphs)!

Item was added:
+ ----- Method: ProportionalSplitterMorph>>showHandle (in category 'accessing') -----
+ showHandle
+
+ ^ showHandle ifNil: [self class showSplitterHandles]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>siblingSplittersDo: (in category 'queries - adjacent splitters') -----
- ----- Method: ProportionalSplitterMorph>>siblingSplittersDo: (in category 'adjacent splitters') -----
  siblingSplittersDo: aBlock
  owner ifNotNil:
  [ owner submorphsDo:
  [ : each | ((each isKindOf: self class) and:
  [ self splitsTopAndBottom = each splitsTopAndBottom and: [ each ~= self ] ]) ifTrue: [ aBlock value: each ] ] ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>splitsLeftAndRight (in category 'testing') -----
- ----- Method: ProportionalSplitterMorph>>splitsLeftAndRight (in category 'direction') -----
  splitsLeftAndRight
 
  ^ self splitsTopAndBottom not!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>splitsTopAndBottom (in category 'testing') -----
- ----- Method: ProportionalSplitterMorph>>splitsTopAndBottom (in category 'direction') -----
  splitsTopAndBottom
 
  ^ splitsTopAndBottom!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>splitterAbove (in category 'queries - adjacent splitters') -----
- ----- Method: ProportionalSplitterMorph>>splitterAbove (in category 'adjacent splitters') -----
  splitterAbove
  | immediatelyAbove |
  immediatelyAbove := nil.
  self siblingSplittersDo:
  [ : each | "Splitter y's map 0 at the bottom."
  each y > self y ifTrue:
  [ immediatelyAbove
  ifNil: [ immediatelyAbove := each ]
  ifNotNil:
  [ each y < immediatelyAbove y ifTrue: [ immediatelyAbove := each ] ] ] ].
  ^ immediatelyAbove!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>splitterBelow (in category 'queries - adjacent splitters') -----
- ----- Method: ProportionalSplitterMorph>>splitterBelow (in category 'adjacent splitters') -----
  splitterBelow
  | immediatelyBelow |
  immediatelyBelow := nil.
  self siblingSplittersDo:
  [ : each | each y < self y ifTrue:
  [ immediatelyBelow
  ifNil: [ immediatelyBelow := each ]
  ifNotNil:
  [ each y > immediatelyBelow y ifTrue: [ immediatelyBelow := each ] ] ] ].
  ^ immediatelyBelow!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>splitterLeft (in category 'queries - adjacent splitters') -----
- ----- Method: ProportionalSplitterMorph>>splitterLeft (in category 'adjacent splitters') -----
  splitterLeft
  | immediateLeft |
  immediateLeft := nil.
  self siblingSplittersDo:
  [ : each | each x < self x ifTrue:
  [ immediateLeft
  ifNil: [ immediateLeft := each ]
  ifNotNil:
  [ each x > immediateLeft x ifTrue: [ immediateLeft := each ] ] ] ].
  ^ immediateLeft!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>splitterRight (in category 'queries - adjacent splitters') -----
- ----- Method: ProportionalSplitterMorph>>splitterRight (in category 'adjacent splitters') -----
  splitterRight
  | immediateRight |
  immediateRight := nil.
  self siblingSplittersDo:
  [ : each | each x > self x ifTrue:
  [ immediateRight
  ifNil: [ immediateRight := each ]
  ifNotNil:
  [ each x < immediateRight x ifTrue: [ immediateRight := each ] ] ] ].
  ^ immediateRight!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>splittersAboveDo: (in category 'queries - adjacent splitters') -----
- ----- Method: ProportionalSplitterMorph>>splittersAboveDo: (in category 'adjacent splitters') -----
  splittersAboveDo: aBlock
  self splitterAbove ifNotNil:
  [ : splitter | aBlock value: splitter.
  splitter splittersAboveDo: aBlock ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>splittersBelowDo: (in category 'queries - adjacent splitters') -----
- ----- Method: ProportionalSplitterMorph>>splittersBelowDo: (in category 'adjacent splitters') -----
  splittersBelowDo: aBlock
  self splitterBelow ifNotNil:
  [ : splitter | aBlock value: splitter.
  splitter splittersBelowDo: aBlock ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>splittersLeftDo: (in category 'queries - adjacent splitters') -----
- ----- Method: ProportionalSplitterMorph>>splittersLeftDo: (in category 'adjacent splitters') -----
  splittersLeftDo: aBlock
  self splitterLeft ifNotNil:
  [ : splitter | aBlock value: splitter.
  splitter splittersLeftDo: aBlock ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>splittersRightDo: (in category 'queries - adjacent splitters') -----
- ----- Method: ProportionalSplitterMorph>>splittersRightDo: (in category 'adjacent splitters') -----
  splittersRightDo: aBlock
  self splitterRight ifNotNil:
  [ : splitter | aBlock value: splitter.
  splitter splittersRightDo: aBlock ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>step (in category 'smart splitters - stepping') -----
- ----- Method: ProportionalSplitterMorph>>step (in category 'events') -----
  step
  splitsTopAndBottom
  ifTrue: [ self reduceTopBottomImbalance ]
  ifFalse:
  [ self reduceLeftRightImbalance abs > 1 ifTrue:
  [ self splittersLeftDo:
  [ : splitter | splitter reduceLeftRightImbalance ].
  self splittersRightDo:
  [ : splitter | splitter reduceLeftRightImbalance ] ] ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>stepTime (in category 'smart splitters - stepping') -----
- ----- Method: ProportionalSplitterMorph>>stepTime (in category 'events') -----
  stepTime
  "When a splitter finds itself in the right place, let it rest for about 3 seconds to avoid performance impacts of constant, rapid stepping."
  | pause |
  pause := 3000. "Frozen image when atRandom failed due to lock on its Mutex."
  ^ ({#(1 -1 1 ).  #(-1 1 -1 )} includes: self movements asArray)
  ifTrue: [ pause "don't twitch" ]
  ifFalse:
  [ splitsTopAndBottom
  ifTrue:
  [ self topBottomCorrection isZero
  ifTrue: [ pause ]
  ifFalse: [ 0 ] ]
  ifFalse:
  [ self leftRightImbalance abs > 1
  ifTrue: [ ">1 rather than 0 to discourage one-off twitching"
  0 ]
  ifFalse: [ pause ] ] ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>stopStepping (in category 'smart splitters - stepping') -----
- ----- Method: ProportionalSplitterMorph>>stopStepping (in category 'events') -----
  stopStepping
  super stopStepping.
  (self class smartVerticalSplitters or: [ self class smartHorizontalSplitters ]) ifFalse: [ self balanceOffsets ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>topBottomCorrection (in category 'smart splitters - queries') -----
- ----- Method: ProportionalSplitterMorph>>topBottomCorrection (in category 'layout') -----
  topBottomCorrection
  ^ self top < self topBoundary
  ifTrue: [ self topBoundary - self top ]
  ifFalse:
  [ self bottom > (self bottomBoundary)
  ifTrue: [ self bottomBoundary - self bottom ]
  ifFalse:
  [ | wsAbove wsBelow |
  wsAbove := self canEncroachWhiteSpaceOf: leftOrTop.
  wsBelow := self canEncroachWhiteSpaceOf: rightOrBottom.
  wsAbove
  ifTrue:
  [ wsBelow
  ifTrue:
  [ self splitterBelow
  ifNil: [0]
  ifNotNil: [ : below | below reduceTopBottomImbalance min: 0 ] ]
  ifFalse: [ (self top > self topBoundary) ifTrue: [-2] ifFalse: [0] ] ]
  ifFalse:
  [ wsBelow
  ifTrue: [ (self bottom < self bottomBoundary) ifTrue: [2] ifFalse: [0] ]
  ifFalse:
  [ self splitterBelow
  ifNil: [0]
  ifNotNil: [ : below | below reduceTopBottomImbalance max: 0 ] ] ] ] ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>topBoundary (in category 'queries - geometry') -----
- ----- Method: ProportionalSplitterMorph>>topBoundary (in category 'boundaries') -----
  topBoundary
  "Answer the topmost x position the receiver could be moved to."
 
  | splitter morphs |
  splitter := self splitterAbove.
  morphs := self commonNeighbours: leftOrTop with: splitter.
 
  ^ (splitter
  ifNil: [owner isSystemWindow ifTrue: [owner panelRect top]
  ifFalse: [owner innerBounds top]]
  ifNotNil: [splitter bottom])
  + (self minimumHeightOf: morphs)!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>wantsSteps (in category 'smart splitters - stepping') -----
- ----- Method: ProportionalSplitterMorph>>wantsSteps (in category 'events') -----
  wantsSteps
  ^ splitsTopAndBottom
  ifTrue: [ self class smartHorizontalSplitters ]
  ifFalse: [ self class smartVerticalSplitters ]!

Item was changed:
+ ----- Method: ProportionalSplitterMorph>>withSiblingSplittersDo: (in category 'queries - adjacent splitters') -----
- ----- Method: ProportionalSplitterMorph>>withSiblingSplittersDo: (in category 'adjacent splitters') -----
  withSiblingSplittersDo: aBlock
  aBlock value: self.
  self siblingSplittersDo: aBlock!

Item was changed:
  ----- Method: RightGripMorph>>apply: (in category 'target resize') -----
  apply: delta
  | oldBounds |
+ oldBounds := self target bounds.
+ self target
- oldBounds := target bounds.
- target
  bounds: (oldBounds origin corner: oldBounds corner + (delta x @ 0))!

Item was changed:
  ----- Method: RightGripMorph>>gripLayoutFrame (in category 'accessing') -----
  gripLayoutFrame
  ^ LayoutFrame
  fractions: (1 @ 0 corner: 1 @ 1)
+ offsets: (0 @ 0 corner: 0 @ 0)!
- offsets: (0 @ self defaultHeight negated corner: self defaultWidth @ 0)!

Item was added:
+ ----- Method: RightGripMorph>>layoutProportionallyIn: (in category 'layout') -----
+ layoutProportionallyIn: cellBounds
+
+ super layoutProportionallyIn: cellBounds.
+
+ self flag: #workaround. "mt: We cannot know that our owner has always the correct new bounds at this time."
+ self right: owner right.
+
+ self top: owner top.
+ self height: owner height.!

Item was added:
+ ----- Method: RightGripMorph>>orientation (in category 'accessing') -----
+ orientation
+
+ ^ #vertical!

Item was changed:
  ----- Method: TopGripMorph>>apply: (in category 'target resize') -----
  apply: delta
  | oldBounds |
+ oldBounds := self target bounds.
+ self target
- oldBounds := target bounds.
- target
  bounds: (oldBounds origin + (0 @ delta y) corner: oldBounds corner)!

Item was changed:
  ----- Method: TopGripMorph>>gripLayoutFrame (in category 'accessing') -----
  gripLayoutFrame
  ^ LayoutFrame
  fractions: (0 @ 0 corner: 1 @ 0)
+ offsets: (0 @ 0 corner: 0@ 0)!
- offsets: (0 @ (-40 - self defaultHeight)  corner: 0@ 0)!

Item was added:
+ ----- Method: TopGripMorph>>layoutProportionallyIn: (in category 'layout') -----
+ layoutProportionallyIn: cellBounds
+
+ super layoutProportionallyIn: cellBounds.
+
+ self flag: #workaround. "mt: We cannot know that our owner has always the correct new bounds at this time."
+ self top: owner top.!

Item was added:
+ ----- Method: TopGripMorph>>orientation (in category 'accessing') -----
+ orientation
+
+ ^ #horizontal!

Item was changed:
  ----- Method: TopLeftGripMorph>>apply: (in category 'target resize') -----
  apply: delta
  | oldBounds |
+ oldBounds := self target bounds.
+ self target
- oldBounds := target bounds.
- target
  bounds: (oldBounds origin + delta corner: oldBounds corner)!

Item was removed:
- ----- Method: TopLeftGripMorph>>borderOffset (in category 'private') -----
- borderOffset
- |width|
- width :=SystemWindow borderWidth +1.
- ^self handleOrigin + width asPoint!

Item was added:
+ ----- Method: TopLeftGripMorph>>drawOn: (in category 'drawing') -----
+ drawOn: aCanvas
+
+ super drawOn: aCanvas.
+
+ self showHandle ifTrue: [
+ aCanvas
+ fillRoundRect: ((self topLeft + self handleInset asPoint extent: self class gripThickness @ self height) insetBy: self handleInset)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor).
+ aCanvas
+ fillRoundRect: ((self topLeft + self handleInset asPoint extent: self width @ self class gripThickness) insetBy: self handleInset)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor).
+
+
+ ].!

Item was removed:
- ----- Method: TopLeftGripMorph>>handleOrigin (in category 'private') -----
- handleOrigin
- ^25@25!

Item was changed:
  ----- Method: TopLeftGripMorph>>layoutProportionallyIn: (in category 'layout') -----
+ layoutProportionallyIn: cellBounds
+
+ self flag: #workaround. "mt: We cannot know that our owner has always the correct new bounds at this time."
+ self topLeft: owner topLeft.!
- layoutProportionallyIn: newBounds
- | b |
- b := owner bounds.
- self bounds: (b topLeft extent: self extent)
- !

Item was changed:
+ ----- Method: TopLeftGripMorph>>ptName (in category 'accessing') -----
- ----- Method: TopLeftGripMorph>>ptName (in category 'target resize') -----
  ptName
  ^#topLeft!

Item was changed:
  ----- Method: TopRightGripMorph>>apply: (in category 'target resize') -----
  apply: delta
  | oldBounds |
+ oldBounds := self target bounds.
+ self target
- oldBounds := target bounds.
- target
  bounds: (oldBounds origin + (0@delta y) corner: oldBounds corner + (delta x @ 0))!

Item was removed:
- ----- Method: TopRightGripMorph>>borderOffset (in category 'private') -----
- borderOffset
- |width|
- width :=SystemWindow borderWidth +1 .
- ^self handleOrigin + ( width negated @ (width) )!

Item was added:
+ ----- Method: TopRightGripMorph>>drawOn: (in category 'drawing') -----
+ drawOn: aCanvas
+
+ super drawOn: aCanvas.
+
+ self showHandle ifTrue: [
+ aCanvas
+ fillRoundRect: ((self topRight + ((self handleInset negated + self class gripThickness negated) @ self handleInset) extent: self class gripThickness @ self height) insetBy: self handleInset)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor).
+ aCanvas
+ fillRoundRect: ((self topLeft + (self handleInset negated @ self handleInset) extent: self width @ self class gripThickness) insetBy: self handleInset)
+ radius: 3
+ fillStyle: (SolidFillStyle color: self handleColor).]!

Item was changed:
  ----- Method: TopRightGripMorph>>gripLayoutFrame (in category 'accessing') -----
  gripLayoutFrame
  ^ LayoutFrame
  fractions: (1 @ 0 corner: 1 @ 0)
+ offsets: (0 @ 0 corner: 0 @ 0)!
- offsets:  (0 @ 0 corner: 0 @ 0)!

Item was removed:
- ----- Method: TopRightGripMorph>>handleOrigin (in category 'private') -----
- handleOrigin
- ^0@25!

Item was changed:
  ----- Method: TopRightGripMorph>>layoutProportionallyIn: (in category 'layout') -----
+ layoutProportionallyIn: cellBounds
+
+ self flag: #workaround. "mt: We cannot know that our owner has always the correct new bounds at this time."
+ self topRight: owner topRight.!
- layoutProportionallyIn: newBounds
- | b |
- b := owner bounds.
-
- self bounds: (b right - self width @ b top extent: self extent)
- !

Item was changed:
+ (PackageInfo named: 'Morphic') postscript: '"Migrate all open resizers."
+ AbstractResizerMorph allSubInstancesDo: [:ea |
+ ea handleColor isColor ifFalse: [ea handleColor: nil].
+ ea removeAllMorphs].
+
+ "Re-enable deprecation warnings in Trunk."
+ Deprecation showDeprecationWarnings: true.'!
- (PackageInfo named: 'Morphic') postscript: 'SmalltalkEditor initializeShiftCmdKeyShortcuts'!