[squeak-dev] The Trunk: MorphicExtras-nice.134.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Dec 11 23:48:53 UTC 2013


Nicolas Cellier uploaded a new version of MorphicExtras to project The Trunk:
http://source.squeak.org/trunk/MorphicExtras-nice.134.mcz

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

Name: MorphicExtras-nice.134
Author: nice
Time: 12 December 2013, 12:47:36.164 am
UUID: 8675f085-dad7-499d-a3b9-b277864ea9c4
Ancestors: MorphicExtras-nice.133

PaintBoxMorph re-engineering: a first attempt at reconstructing the Prototype (from which new instances are cloned).
Reminder: this is required step in order to properly unload/reload MorphicExtras via Monticello.

=============== Diff against MorphicExtras-nice.133 ===============

Item was changed:
  ImageMorph subclass: #PaintBoxMorph
  	instanceVariableNames: 'action tool currentCursor thumbnail currentColor currentBrush colorMemory colorPatch stampHolder rotationTabForm scaleTabForm colorMemoryThin brushes focusMorph weakDependents recentColors'
+ 	classVariableNames: 'AllOffImage AllOnImage AllPressedImage ColorChart ImageLibrary OriginalBounds Prototype RecentColors ScaleTabImage UseLargeColorPicker'
- 	classVariableNames: 'AllOffImage AllOnImage AllPressedImage ColorChart ColorMemoryImage ColorMemoryThinImage OriginalBounds PaletteImage Prototype RecentColors RotationTabImage ScaleTabImage ShapeTabImage StampTabImage UseLargeColorPicker'
  	poolDictionaries: ''
  	category: 'MorphicExtras-Support'!

Item was changed:
  ----- Method: PaintBoxMorph class>>colorMemoryImage (in category 'resources') -----
(excessive size, no diff calculated)

Item was changed:
  ----- Method: PaintBoxMorph class>>colorMemoryThinImage (in category 'resources') -----
  colorMemoryThinImage
+ 	^self imageLibrary at: #colorMemoryThinImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
- 	^ColorMemoryThinImage ifNil: [ColorMemoryThinImage := Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
  		'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' readStream)]!

Item was changed:
+ ----- Method: PaintBoxMorph class>>fixUpPrototype (in category 'class initialization') -----
- ----- Method: PaintBoxMorph class>>fixUpPrototype (in category 'as yet unclassified') -----
  fixUpPrototype
  	"PaintBoxMorph fixUpPrototype"
  self error: 'who uses this?'.
  	Prototype eventHandler: nil!

Item was added:
+ ----- Method: PaintBoxMorph class>>imageLibrary (in category 'resources') -----
+ imageLibrary
+ 	^ImageLibrary ifNil: [ImageLibrary := IdentityDictionary new]!

Item was added:
+ ----- Method: PaintBoxMorph class>>newPrototype (in category 'instance creation') -----
+ newPrototype
+ 	^self basicNew buildAPrototype!

Item was changed:
  ----- Method: PaintBoxMorph class>>paletteImage (in category 'resources') -----
(excessive size, no diff calculated)

Item was added:
+ ----- Method: PaintBoxMorph class>>paletteOnImage (in category 'resources') -----
(excessive size, no diff calculated)

Item was changed:
+ ----- Method: PaintBoxMorph class>>prototype (in category 'resources') -----
- ----- Method: PaintBoxMorph class>>prototype (in category 'as yet unclassified') -----
  prototype
  	"Later we will be a subclass of Model, and it will have a general version of this"
+ 	^ Prototype ifNil: [Prototype := self newPrototype]!
- 	^ Prototype!

Item was changed:
  ----- Method: PaintBoxMorph class>>rotationTabImage (in category 'resources') -----
  rotationTabImage
+ 	^self imageLibrary at: #rotationTabImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
- 	^RotationTabImage ifNil: [RotationTabImage := Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
  		'iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABHNCSVQFBQUBSsjp7wAAAwZJREFUeF6VlS2UpDAQhCORSCQSiUQikUgkEolEIpFIJBKJRCKRSOTIkchxfVX5Ydnd2b27vNdvZjbJ19WVTlb9Np7rKkfbypplskSRTEEgUxjKlCSy1JXs8yzqf8e577IXuWxhIFtgYkUsiJkJECOiD3wZkOifkzynSXao3AHWEZhwCVySjwSBtEgyNc3vCR59r4HH17gl2L5UMCA635cG0Zel/KiYoIeOUAdBNTZFnicRqonjWEL8TvGbwNmpx/cWUTFBXcs3j4840uAnAGdRyJSmElERyt0xf56njsfjITM8TuA1kwwEBgZOIYXvyTyOHwmOPDdgqD2rUuau00q3bZPX6/VjMHGklIZ3Fl4iclRDEercVu2zhkewAxsytN5xHBeECwkqUFEJX0coc3P8nVubGgvPWBEEqkfbXF4TPqCKu+IVvR5Z70co7K3nFECbns+neFDfXMo9Da/BUTtVXnC0FZTcS8/g/dbUOvFh25P9T7U1Dk+vAYNeOzjnctiqNrvJeI6TRzkOzApaHPSZJXrewdeQrejrzuG6FreY1dQAO+UJ5tRqN7gEXOjgPfqeXt7Bs+2MKTAtSmu4LsH3CuDCwmOEWqB8u12YlK2IDYQPwyAlFl122K7w8Deq9vHJdVVVaWBp4awipvIlTXSZLgEXsY+5iYcVoT0HQDm/Br5WzgPmQbuDZ7LUwnP7PcU+teF1W+xmBkG8IM4aqo89dYFpR3IT4OzjfQnQNdpvRIFGUAcWcQMTrCGTmD5lX7tOaHnrLJjtSG/Z37SPyXnhCI6tan527iGbklhvnG2SWatTkiI7VTsoq+JtbACn37QstGpph1MdYX6HZeb6L7PeOFp1Luhhh3BgHqa5iQZW3Hy+wHfVbiy4qb2F3KPXt9IkoT2Nb/pZW2MTOHDsvH43RvhIQHcDvoXalss/gWEP2lg/WD+NCVe6trDmBv0E9r6Diyz9HezGilevxmGVFuaU3tWmFhr7bzz+6/9SqJjwzrR43Uq0WhaY1zDh9WZiKCX06oo34w9N0ZSkQD6ZeQAAAABJRU5ErkJggg==' readStream)]!

Item was changed:
  ----- Method: PaintBoxMorph class>>scaleTabImage (in category 'resources') -----
  scaleTabImage
+ 	^self imageLibrary at: #scaleTabImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
- 	^ScaleTabImage ifNil: [ScaleTabImage := Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
  		'iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABHNCSVQFBQUBSsjp7wAAAr9JREFUeF6VlSGUo0AQRJHISCQSiUQikUgkEolEIpHISCQSGYlEIpFIJBLXVzVpcvOyZHPHe7UDZPOrp6e74/x27eMoS13LnCQyBoEMnie970sfRfIoC5mHQZz/vfZ5liVLZfa9p7ynRsgYQB3Ueje5w+ifTba+lzUMZAV0Ua0ALdCkBg81MQa3m9RQX1W/G2xta6AbtJvVN/cr1kWjtw3MDgCmQeW60mbZtcHOiC3wAeCuosl6ATcpUngNeOE40haF/MgxU2HAgS9HFMoRhsbgNDFpuooe4DvUAF4CnkLD/f7XYE1TBSPiOJKjLKEC97Hk+GKGSslgFgMW4ZkKKQADyAcwhypdE3y2rqs4+zSaQyP8YNSokqPrnsIWE0Bn7gz/vCyLubfFdymCSy14zPQ0jThrXb1y/YLjg6Op5UgTqfJc9n2X4zg+qkAQNjzhit5wFvxZ9RBNWpjvJJYd4n2DJvoGzxHAOzzGOTkTol2sKqEBD/VUi/r9Bs9Qgu9wnoczno1iGTzQeT1XHGSOfA7oQKpHuW7b9gPOnBPIask05wHkjIhutgwoVgLz2KKpGuS/Rmr4HOJw+fwJXig8esFRepPOkLPdWXJX26dZhTRdwWNNSarwEAxnQj0zDTQ4FeGDq+2fu7jKeaRRJxp1ih5xFuYScBqMPoT1N3iML9GgRKMxVVw9NpcVNZuqxnvToT1KjgaDmoTQFZxpCTXCVBUrMNH7UOHzND3hy2OQO4Adq8R7tjY7kiVoi5ET2DAyrY7cMjnBzfv4feBFe3MxhDArXOQNZcjqsMXtn/VcfACn+PG4HLtdnmHwu9Lc4O5a0kgrK9rsAhwjIDOwPl0dDqlQyLsKC5pY9expdawYYl9/6h6Yx2bUKswGngd4RuujzetvP3HvF6PocIAlBluKIRRxdjNSrCxVRkrodFbFxfUHM1HXoyHv+TYAAAAASUVORK5CYII=' readStream)]!

Item was changed:
  ----- Method: PaintBoxMorph class>>shapeTabImage (in category 'resources') -----
  shapeTabImage
+ 	^self imageLibrary at: #shapeTabImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
- 	^ShapeTabImage ifNil: [ShapeTabImage := Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
  		'iVBORw0KGgoAAAANSUhEUgAAACUAAAAXCAYAAACMLIalAAAABHNCSVQFBQUBSsjp7wAAAmFJREFUeF7FlCGQpDAQRZHIkStPjkSuHHlyJRKJRCKRSCQSiYyMRCKRSGQkclxf/w4ZAlu3M2zVsqn6RRFI5/XvTgKtChqHlqaxJTMpuhstmkZFfVdT2xbU1Dm1TUFBEFJWdw/lTS8q2sETz9Wa0rJ9zGHd0DeicWi+3MuYiQ5DORCBcVpg3HucFhS9/2W4jt+7X4JalDNAkld0eXujK0NllRLXToVa1QlAnOYCdItThqulhJg/Hwq9xQLQNXpnh24Us1sWqvkFKAHSlBWlfAMQYJIFKmOn8uqM8i3OWClKMjt/+0gozsrVpaI5safclcAOAOjPNeKy3SxQVgmUAMElBjrl9Nk7SlNZN7Zkke0hAcosUFoq+QfXRHnGPZWwAzhdm5ItDiWFPXFwCD0HoFKNPw8V88bR7UPuIQeDpwVa+mi5t0p1EhR6KeWN4QhArJrHneRueOdSdTaU9I8HZBt7KdujdBg/DHUJLxuFYfhUWKdV9TrUMGgvC/vzjJ9nLU8swLyfqS/Vllaq5I1X4d19QwwIsffx8Y64+A/JG2MomGezs3ZdhCwcGLID3F5u7VcyO6Bt0i11eq3IPM+25NPUi33/c8tlBCHIUfkws9kmiz3hLNpjmlwP8gAdoByYH+juBfHhjsgH8uMMXJlOVw+XpHT+MGbcgPmO+Rl+R3sY5xCA0EufXPLHNA1S3xVscW1Un5w7CuVgbB/WrwH5jmEBtHVude+o3IHoBaaW60FOJZvwFMjvMSzAYr0AOshXTtteXWed2cIMhJMfHB33+8zWG852tIFGqP+GLATizOY5yD+ABou9MdPjbQAAAABJRU5ErkJggg==' readStream)]!

Item was added:
+ ----- Method: PaintBoxMorph class>>shapesImage (in category 'resources') -----
+ shapesImage
+ 	^self imageLibrary at: #shapesImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
+ 		'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' readStream)]!

Item was added:
+ ----- Method: PaintBoxMorph class>>shapesOnImage (in category 'resources') -----
+ shapesOnImage
+ 	^self imageLibrary at: #shapesOnImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
+ 		'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' readStream)]!

Item was changed:
  ----- Method: PaintBoxMorph class>>stampTabImage (in category 'resources') -----
  stampTabImage
+ 	^self imageLibrary at: #stampTabImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
- 	^StampTabImage ifNil: [StampTabImage := Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
  		'iVBORw0KGgoAAAANSUhEUgAAADMAAAAWCAYAAABtwKSvAAAABHNCSVQFBQUBSsjp7wAAA6tJREFUeF69ViuwqzAURFYikUgkEhkZiUQiI5FIJLISWYlEIisrkUhkJLLuvLNJU0J75777PoWZnbTAJmd3T9IG49DQPPW0zD3pZaC7Hg2WeaDbtaO+b+jS1dRfGgqCExVVYVEXVNblDrjnYO41JSmgVTtU54rBn8/q7ZkPrDfdLgbzdPm2Rq0X+jsxLwVjbHjszznVSvA7uX3uCUHxVoQF7p353tAVdK4llRXm2zh45/Ni6pdUHmJ0J+k+KhqrjPIspryUT0G+CIe2LWk9C8OZGkkqi54c1ZZHi9mSQVpKRNTIxIxpdKJMpJSr/CFGvQuCCWlItYwNRHyiJLGCnAGHiFEQ4vYOI+e2UqUgyQXFYUDhKWAxGUlXGLdNDUHP/VAaM5TieTgRcCLmxHFEspDGJBjwcTEVF7HUKS2t4PYQNHCLFEVGV/5cipjiBIh2yXRtQbrJDOfWSurRViz+xmPDqaRpYjgpc+SRyZScQhOHNGQhTVVKMxeJtkKbpFxQnMaUZAmJQtj2w2bmsY0CusqIZjbiUqbMCUgmoUkFYt44h7QZ2ordy+OYFBdScVECe4TFZCwm4cIyuTnsTrOSUyq4jSrmlMzJnpzQiDFJeqkck0xt9wiKFZL3RRRSwf2ehyiQwakJrzD12Pz4vSlYkMSzkE3h94vIcThZTmY7MFhMd4SYxm5el5DIM8rY2fwhSqJt0HZpZIrffiQhSBme5HYSHudphDnNxHFtZsQ4GFGPlCAKG5j3TM7pSEbORTun60tNNc+Dz7iHFHBygSeRCgsBB8nZ0+wAMXDX/8vhhJmkXIEsAu4/24ZbpmF+01tAmPsXYLm5SRmm+JyPiwlP4Q6n0+kPERqEPwDWG4fzz8VM0+ipty+veHkdzQgC7vsO+Rj61mJoeeEN+P585j2/jmdTALCfr7emPoy1GAxQ02td+A4+5obZWmsK1lW/RLmRoN4JwuRuQR+O+z26By5fmLKfzxeiX4TsTe7ZmK1z1nXlJPlalpvn1Hs6zglgW+wT2Cfhi1j13lzUiqTR/ssyWyG4oMqP3vWmm+Cu30X9f/D8y7gr/iuY9uJE0a4uFdNi/qX1/NLL/ZfOfBzrhlcRLhEIwV55S8W/lmUyfehvTpPSPLwl9b/xXRLbIdT9TIifEAhfnzr9B9tseBbuHzhY+2ZEdOaYhhCY/lsh/h4CAeTxIcyJ+9np9W9wJl6vNom9iIlwAgd/et3vK0et2bHZTjQDtwNhi8f6q/69gF+MUOdTGgYgKwAAAABJRU5ErkJggg==' readStream)]!

Item was added:
+ ----- Method: PaintBoxMorph class>>stampsImage (in category 'resources') -----
+ stampsImage
+ 	^self imageLibrary at: #stampsImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
+ 		'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' readStream)]!

Item was added:
+ ----- Method: PaintBoxMorph class>>stampsOnImage (in category 'resources') -----
+ stampsOnImage
+ 	^self imageLibrary at: #stampsOnImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
+ 		'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' readStream)]!

Item was added:
+ ----- Method: PaintBoxMorph>>addActionsOffImage:onImage: (in category 'initialization') -----
+ addActionsOffImage: offImage onImage: onImage
+ 	| posSpec actionSpec |
+ 	posSpec := #(
+ 		(53 53 53 53) "offset X"
+ 		(154 178 202 226) "offset Y"
+ 		(39 39 39 39) "width"
+ 		(23 23 23 23) "height").
+ 	actionSpec := #(undo:with:evt: keep:with:evt: clear:with:evt: toss:with:evt:).
+ 	#(undo: keep: clear: toss:) keysAndValuesDo: [:index :name |
+ 		| button rect |
+ 		(self submorphNamed: name) ifNil:
+ 			[rect := ((posSpec at: 1) at: index) @ ((posSpec at: 2) at: index)
+ 					extent: ((posSpec at: 3) at: index) @ ((posSpec at: 4) at: index).
+ 			(button := ThreePhaseButtonMorph new)
+ 				onImage: (onImage copy: rect);
+ 				offImage: (offImage copy: rect);
+ 				pressedImage: (onImage copy: rect);
+ 				bounds: (rect translateBy: self position);
+ 				setNamePropertyTo: name;
+ 				actionSelector: (actionSpec at: index); 
+ 					arguments: (Array with: button with: name);
+ 				actWhen: #buttonUp; target: self.
+ 			self addMorph: button.]].!

Item was added:
+ ----- Method: PaintBoxMorph>>addBrushesOffImage:onImage: (in category 'initialization') -----
+ addBrushesOffImage: offImage onImage: onImage
+ 	| posSpec |
+ 	posSpec := #(
+ 		(13 36 63 13 36 63) "offset X"
+ 		(107 107 107 124 124 124) "offset Y"
+ 		(21 24 27 21 24 27) "width"
+ 		(18 18 18 25 25 25) "height").
+ 	#(brush1: brush2: brush3: brush4: brush5: brush6: ) keysAndValuesDo: [:index :name |
+ 		| button nib rect |
+ 		(self submorphNamed: name) ifNil:
+ 			[nib := Form dotOfSize: (#(1 2 3 6 11 26) at: index).
+ 			rect := ((posSpec at: 1) at: index) @ ((posSpec at: 2) at: index)
+ 					extent: ((posSpec at: 3) at: index) @ ((posSpec at: 4) at: index).
+ 			(button := ThreePhaseButtonMorph new)
+ 				onImage: (onImage copy: rect) as8BitColorForm;
+ 				offImage: (offImage copy: rect) as8BitColorForm;
+ 				pressedImage: (onImage copy: rect) as8BitColorForm;
+ 				bounds: (rect translateBy: self position);
+ 				setNamePropertyTo: name;
+ 				actionSelector: #brush:action:nib:evt:; 
+ 					arguments: (Array with: button with: name with: nib);
+ 				actWhen: #buttonUp; target: self.
+ 			self addMorph: button.]].
+ 	brushes := #(brush1: brush2: brush3: brush4: brush5: brush6: ) collect: [:name | self submorphNamed: name]
+ 
+ !

Item was changed:
+ ----- Method: PaintBoxMorph>>addGraphicLabels (in category 'initialization') -----
- ----- Method: PaintBoxMorph>>addGraphicLabels (in category 'other') -----
  addGraphicLabels
  	"translate button labels"
  
  	| formTranslator |
  	formTranslator := NaturalLanguageFormTranslator localeID: (Locale current localeID).
  
  	#('KEEP' 'UNDO' 'CLEAR' 'TOSS') do: [:label |
  		(formTranslator translate: label, '-off') ifNil: [^ false].
  		(formTranslator translate: label, '-pressed') ifNil: [^ false].
  	].
  	
  	#('keep:' 'undo:' 'clear:' 'toss:') with: #('KEEP' 'UNDO' 'CLEAR' 'TOSS') do: [:extName :label |
  		| button newForm ext pos |
  		button := submorphs detect: [:m | m externalName = extName] ifNone: [nil].
  		button ifNotNil: [
  			button removeAllMorphs.
  			ext := button extent.
  			pos := button position.
  			(newForm := formTranslator translate: label, '-off') ifNotNil: [
  				button offImage: newForm.
  
  			].
  			(newForm := formTranslator translate: label, '-pressed') ifNotNil: [
  				button pressedImage: newForm.
  			].
  			button extent: ext.
  			button position: pos.
  		].
  	].
  
  	^ true.
  !

Item was changed:
+ ----- Method: PaintBoxMorph>>addLabels (in category 'initialization') -----
- ----- Method: PaintBoxMorph>>addLabels (in category 'other') -----
  addLabels
  
  	Preferences useFormsInPaintBox ifFalse: [
  		self addTextualLabels.
  	] ifTrue: [
  		self addGraphicLabels ifFalse: [self addTextualLabels].
  	].
  !

Item was added:
+ ----- Method: PaintBoxMorph>>addShapeButtonsOffImage:onImage: (in category 'initialization') -----
+ addShapeButtonsOffImage: offImage onImage: onImage
+ 	| shapes posSpec |
+ 	posSpec := #(
+ 		(17 17 17 17 17) "offset X"
+ 		(0 22 44 66 88) "offset Y"
+ 		(30 30 30 30 30) "width"
+ 		(21 21 21 21 21) "height").
+ 	shapes := self submorphNamed: 'shapes'.
+ 	#(line: rect: ellipse: poylgon: star:) keysAndValuesDo: [:index :name |
+ 		| button rect |
+ 		(self submorphNamed: name) ifNil:
+ 			[rect := ((posSpec at: 1) at: index) @ ((posSpec at: 2) at: index)
+ 					extent: ((posSpec at: 3) at: index) @ ((posSpec at: 4) at: index).
+ 			(button := ThreePhaseButtonMorph new)
+ 				onImage: (onImage copy: rect);
+ 				offImage: (offImage copy: rect);
+ 				pressedImage: (onImage copy: rect);
+ 				bounds: (rect translateBy: shapes position);
+ 				setNamePropertyTo: name;
+ 				actionSelector: #tool:action:cursor:evt:; 
+ 					arguments: (Array with: button with: name with: (self makeCursorFrom: (offImage copy: rect)));
+ 				actWhen: #buttonUp; target: self.
+ 			shapes addMorph: button.]].!

Item was added:
+ ----- Method: PaintBoxMorph>>addStampButtonsOffImage:onImage: (in category 'initialization') -----
+ addStampButtonsOffImage: offImage onImage: onImage
+ 	| stamps posSpec actionSpec argSpec names |
+ 	posSpec := #(
+ 		(13 38 63 13 38 63 37 55) "offset X"
+ 		(0 0 0 25 25 25 51 51) "offset Y"
+ 		(25 25 25 25 25 25 15 15) "width"
+ 		(25 25 25 25 25 25 15 15) "height").
+ 	actionSpec := #(
+ 		pickup:action:cursor:evt: pickup:action:cursor:evt: pickup:action:cursor:evt:
+ 		pickup:action:cursor:evt: pickup:action:cursor:evt: pickup:action:cursor:evt:
+ 		scrollStamps:action:evt: scrollStamps:action:evt:).
+ 	argSpec := #(
+ 		stamp: stamp: stamp:
+ 		stamp: stamp: stamp:
+ 		prevStamp: nextStamp:).
+ 	names := #(
+ 		pickup: pickup: pickup:
+ 		stamp: stamp: stamp:
+ 		prevStamp: nextStamp:).
+ 	stamps := self submorphNamed: 'stamps'.
+ 	names keysAndValuesDo: [:index :name |
+ 		| button rect |
+ 		(self submorphNamed: name) ifNil:
+ 			[rect := ((posSpec at: 1) at: index) @ ((posSpec at: 2) at: index)
+ 					extent: ((posSpec at: 3) at: index) @ ((posSpec at: 4) at: index).
+ 			(button := ThreePhaseButtonMorph new)
+ 				onImage: (onImage copy: rect);
+ 				offImage: (offImage copy: rect);
+ 				pressedImage: (onImage copy: rect);
+ 				bounds: (rect translateBy: stamps position);
+ 				setNamePropertyTo: name;
+ 				actionSelector: (actionSpec at: index); 
+ 					arguments: ((Array with: button with: (argSpec at: index) with: Cursor origin) first: (actionSpec at: index) numArgs - 1);
+ 				actWhen: #buttonUp; target: self.
+ 			stamps addMorph: button.]].!

Item was added:
+ ----- Method: PaintBoxMorph>>addStampsAndShapes (in category 'initialization') -----
+ addStampsAndShapes
+ 	| shapeTab shapes stampTab stamps |
+ 	(stampTab := ThreePhaseButtonMorph new)
+ 		onImage: self class stampTabImage;
+ 		offImage: self class stampTabImage;
+ 		pressedImage: self class stampTabImage;
+ 		setNamePropertyTo: 'stampTab';
+ 		actionSelector: #toggleStamps; target: self;
+ 		position: self position + (9 at image height);
+ 		bounds: (stampTab position extent: stampTab onImage extent).
+ 	self addMorph: stampTab.
+ 	
+ 	(shapeTab := ThreePhaseButtonMorph new)
+ 		onImage: self class shapeTabImage;
+ 		offImage: self class shapeTabImage;
+ 		pressedImage: self class shapeTabImage;
+ 		setNamePropertyTo: 'shapeTab';
+ 		actionSelector: #toggleShapes; target: self;
+ 		position: self position + (image width - shapeTab onImage width-9 at image height);
+ 		bounds: (shapeTab position extent: shapeTab onImage extent).
+ 	self addMorph: shapeTab.
+ 	
+ 	self layoutChanged.
+ 	
+ 	(stamps := self class stampsImage asMorph)
+ 		setNamePropertyTo: 'stamps';
+ 		visible: false;
+ 		position: self position + (0@(image height - stamps image height)).
+ 	self addMorph: stamps.
+ 	
+ 	(shapes := self class shapesImage asMorph)
+ 		setNamePropertyTo: 'shapes';
+ 		visible: false;
+ 		position: self position + (image width - shapes image width at image height).
+ 	self addMorph: shapes.!

Item was changed:
+ ----- Method: PaintBoxMorph>>addTextualLabels (in category 'initialization') -----
- ----- Method: PaintBoxMorph>>addTextualLabels (in category 'other') -----
  addTextualLabels
  	"translate button labels"
  
  	#('keep:' 'undo:' 'clear:' 'toss:') with: #('KEEP' 'UNDO' 'CLEAR' 'TOSS') do: [:extName :label |
  		| button |
  		button := submorphs detect: [:m | m externalName = extName] ifNone: [nil].
  		button ifNotNil: [
  			button removeAllMorphs.
  			button addMorph: (TextMorph new 
  				contentsWrapped: (Text string: label translated
  					attributes: {
  						TextAlignment centered. 
  						TextEmphasis bold.
  						TextFontReference toFont:
  							(Preferences standardPaintBoxButtonFont)});
  				bounds: (button bounds translateBy: 0 at 3);
  				lock)]]!

Item was added:
+ ----- Method: PaintBoxMorph>>addToolsOffImage:onImage: (in category 'initialization') -----
+ addToolsOffImage: offImage onImage: onImage
+ 	| posSpec actionSpec |
+ 	posSpec := #(
+ 		(13 53 13 53) "offset X"
+ 		(13 13 61 61) "offset Y"
+ 		(40 40 40 40) "width"
+ 		(48 48 44 44) "height").
+ 	actionSpec := #(tool:action:cursor:evt: tool:action:cursor:evt: eyedropper:action:cursor:evt: tool:action:cursor:evt:).
+ 	#(paint: fill: eyedropper: erase:) keysAndValuesDo: [:index :name |
+ 		| button rect |
+ 		(self submorphNamed: name) ifNil:
+ 			[rect := ((posSpec at: 1) at: index) @ ((posSpec at: 2) at: index)
+ 					extent: ((posSpec at: 3) at: index) @ ((posSpec at: 4) at: index).
+ 			(button := ThreePhaseButtonMorph new)
+ 				onImage: (onImage copy: rect);
+ 				offImage: (offImage copy: rect);
+ 				pressedImage: (onImage copy: rect);
+ 				bounds: (rect translateBy: self position);
+ 				setNamePropertyTo: name;
+ 				actionSelector: (actionSpec at: index); 
+ 					arguments: (Array with: button with: name with: (self makeCursorFrom: (offImage copy: rect)));
+ 				actWhen: #buttonUp; target: self.
+ 			self addMorph: button.]].
+ 
+ !

Item was added:
+ ----- Method: PaintBoxMorph>>buildAPrototype (in category 'initialization') -----
+ buildAPrototype
+ 	| onImage |
+ 	self initialize.
+ 	self image: self class paletteImage.
+ 	rotationTabForm := self class rotationTabImage.
+ 	scaleTabForm := self class scaleTabImage.
+ 	(colorMemoryThin := self class colorMemoryThinImage asMorph)
+ 		setNamePropertyTo: 'ColorPickerClosed';
+ 		position: self position + (11 at 150);
+ 		on: #mouseEnter send: #showColorPalette: to: self.
+ 	self addMorph: colorMemoryThin.
+ 	(colorMemory := PaintBoxColorPicker new image: self class colorMemoryImage)
+ 		setNamePropertyTo: 'ColorPickerOpened';
+ 		on: #mouseDown send: #takeColorEvt:from: to: self.
+ 	
+ 	onImage := self class paletteOnImage.
+ 	self
+ 		addToolsOffImage: image onImage: onImage;
+ 		addBrushesOffImage: image onImage: onImage;
+ 		addActionsOffImage: image onImage: onImage;
+ 		addStampsAndShapes;
+ 		addShapeButtonsOffImage: self class shapesImage onImage: self class shapesOnImage;
+ 		addStampButtonsOffImage: self class stampsImage onImage: self class stampsOnImage.
+ 	stampHolder := ScrollingToolHolder newPrototypeFor: self!

Item was added:
+ ----- Method: PaintBoxMorph>>makeCursorFrom: (in category 'initialization') -----
+ makeCursorFrom: aForm
+ 	| cursor map index colorToReplace |
+ 	cursor :=  aForm as8BitColorForm.
+ 	map := Color indexedColors.	
+ 	index := cursor pixelValueAt: 2 at 2.
+ 	colorToReplace := map at: index.
+ 	cursor colors: (map collect: [:color | (color diff: colorToReplace) < 0.25
+ 		ifTrue: [Color transparent]
+ 		ifFalse: [color]]).
+ 	^cursor
+ 
+ 
+ !

Item was added:
+ ----- Method: ScrollingToolHolder class>>newPrototype (in category 'instance creation') -----
+ newPrototype
+ 	^self new buildAPrototype!

Item was added:
+ ----- Method: ScrollingToolHolder class>>newPrototypeFor: (in category 'instance creation') -----
+ newPrototypeFor: aPaintBoxMorph
+ 	^self new buildAPrototypeFor: aPaintBoxMorph!

Item was added:
+ ----- Method: ScrollingToolHolder>>buildAPrototypeFor: (in category 'initialize-release') -----
+ buildAPrototypeFor: aPaintBoxMorph
+ 	pickupButtons := (aPaintBoxMorph submorphNamed: 'stamps') submorphs select: [:e | e externalName = 'pickup:'].
+ 	stampButtons := (aPaintBoxMorph submorphNamed: 'stamps') submorphs select: [:e | e externalName = 'stamp:'].
+ 	stamps := OrderedCollection new: 3 withAll: nil.
+ 	thumbnailPics := OrderedCollection new: 3 withAll: nil.
+ 	start := 3.!

Item was changed:
+ ----- Method: ScrollingToolHolder>>clear (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>clear (in category 'as yet unclassified') -----
  clear
  	"wipe out all existing stamps"
  
  	stamps := OrderedCollection new: 16.
  	thumbnailPics := OrderedCollection new: 16.
  	stampButtons do: [:each | 
  		stamps addLast: nil.	"hold a space"
  		thumbnailPics addLast: nil].
  	start := 1.
  	self normalize.!

Item was changed:
+ ----- Method: ScrollingToolHolder>>normalize (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>normalize (in category 'as yet unclassified') -----
  normalize
  	"Correspondence between buttons and stamp forms has changed.  Make all thumbnails show up right."
  
  	| shrunkForm button trans |
  	1 to: stampButtons size do: [:ind |
  		shrunkForm := thumbnailPics atWrap: ind+start-1.
  		button := stampButtons at: ind.
  		shrunkForm 
  			ifNil: [trans := Form extent: button extent depth: 8.
  				trans fill: trans boundingBox fillColor: Color transparent.
  				button onImage: trans]
  			ifNotNil: [button onImage: shrunkForm].
  		button offImage: shrunkForm; pressedImage: shrunkForm.	"later modify them"
  		].!

Item was changed:
+ ----- Method: ScrollingToolHolder>>otherButtonFor: (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>otherButtonFor: (in category 'as yet unclassified') -----
  otherButtonFor: aButton
  	"Find the corresponding button for either a pickup or a stamp button"
  
  	| ii |
  	(ii := pickupButtons indexOf: aButton) > 0 ifTrue: [^ stampButtons at: ii].
  	(ii := stampButtons indexOf: aButton) > 0 ifTrue: [^ pickupButtons at: ii].
  	self error: 'stamp button not found'.!

Item was changed:
+ ----- Method: ScrollingToolHolder>>pickupButtons (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>pickupButtons (in category 'as yet unclassified') -----
  pickupButtons
  
  	^ pickupButtons!

Item was changed:
+ ----- Method: ScrollingToolHolder>>pickupButtons: (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>pickupButtons: (in category 'as yet unclassified') -----
  pickupButtons: anArray
  	"Save the list of buttons that are for making a new stamp.  Left to right"
  
  	pickupButtons := anArray!

Item was changed:
+ ----- Method: ScrollingToolHolder>>remove: (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>remove: (in category 'as yet unclassified') -----
  remove: tool
  	"Remove a stamp.  Make this stamp blank.  OK to have a bunch of blank ones."
  
  	| which |
  	which := stampButtons indexOf: tool ifAbsent: [
  				pickupButtons indexOf: tool ifAbsent: [^ self]].
  	stamps atWrap: which+start-1 put: nil.
  	thumbnailPics atWrap: which+start-1 put: nil.
  	self normalize.	"show them"!

Item was changed:
+ ----- Method: ScrollingToolHolder>>scroll: (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>scroll: (in category 'as yet unclassified') -----
  scroll: amt
  	"Move the stamps over"
  
  	start := start - 1 + amt \\ stamps size + 1.
  	self normalize.	"show them"!

Item was changed:
+ ----- Method: ScrollingToolHolder>>stampButtons (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>stampButtons (in category 'as yet unclassified') -----
  stampButtons
  
  	^ stampButtons!

Item was changed:
+ ----- Method: ScrollingToolHolder>>stampButtons: (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>stampButtons: (in category 'as yet unclassified') -----
  stampButtons: anArray
  	"Pop in a new list of buttons that are the tools for stamping.  Left to right"
  
  	stampButtons := anArray.
  	self clear.!

Item was changed:
+ ----- Method: ScrollingToolHolder>>stampForm:for: (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>stampForm:for: (in category 'as yet unclassified') -----
  stampForm: stampForm for: aPickupButton
  	"Install this form to stamp. Find its index.  Make a thumbnail."
  
  	| which scale shrunkForm stampBtn mini |
  	which := pickupButtons indexOf: aPickupButton.
  	which = 0 ifTrue: [which := stampButtons indexOf: aPickupButton].
  	stamps atWrap: which+start-1 put: stampForm.
  
  	"Create the thumbnail"
  	stampBtn := stampButtons at: which.
  	scale := stampBtn width / (stampForm extent x max: stampForm extent y).
  	scale := scale min: 1.0.	"do not expand it"
  	mini := stampForm magnify: stampForm boundingBox by: scale smoothing: 1.
  	shrunkForm := mini class extent: stampBtn extent depth: stampForm depth.
  	mini displayOn: shrunkForm at: (stampBtn extent - mini extent)//2.
  	thumbnailPics atWrap: which+start-1 put: shrunkForm.
  	stampBtn offImage: shrunkForm; onImage: shrunkForm; pressedImage: shrunkForm.
  		"Emphasis is done by border of enclosing layoutMorph, not modifying image"
  
  	(stamps indexOf: nil) = 0 ifTrue: ["Add an extra blank place"
  		"Keep stamp we just installed in the same location!!"
  		start+which-1 > stamps size ifTrue: [start := start + 1].
  		stamps addLast: nil.
  		thumbnailPics addLast: nil.
  		self normalize].
  !

Item was changed:
+ ----- Method: ScrollingToolHolder>>stampFormFor: (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>stampFormFor: (in category 'as yet unclassified') -----
  stampFormFor: aButton
  
  	| which |
  	which := stampButtons indexOf: aButton ifAbsent: [1].
  	^ stamps atWrap: which+start-1!

Item was changed:
+ ----- Method: ScrollingToolHolder>>updateReferencesUsing: (in category 'accessing') -----
- ----- Method: ScrollingToolHolder>>updateReferencesUsing: (in category 'as yet unclassified') -----
  updateReferencesUsing: aDictionary
  	"Fix up the Morphs I own"
  	"Note: Update this method when adding new inst vars that could contain Morphs."
  
  	stampButtons := stampButtons collect:
  		[:old | aDictionary at: old ifAbsent: [old]].
  	pickupButtons := pickupButtons collect:
  		[:old | aDictionary at: old ifAbsent: [old]].
  !



More information about the Squeak-dev mailing list