[squeak-dev] The Trunk: System-mt.1391.mcz

commits at source.squeak.org commits at source.squeak.org
Wed Mar 22 12:46:00 UTC 2023


Marcel Taeumel uploaded a new version of System to project The Trunk:
http://source.squeak.org/trunk/System-mt.1391.mcz

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

Name: System-mt.1391
Author: mt
Time: 22 March 2023, 1:45:57.551694 pm
UUID: b0c05c05-f1d0-1349-9d8a-2b89a066e4b1
Ancestors: System-eem.1390

Thanks to Eliot (eem), recent updates in the ClipboardExtended plugin made it work again. Thus, rescue the image-side code from Etoys to the base system.

Needs more work. I just fixed the following things for win32:
#readAvailableFormats
#hasClipboardData:
#readClipboardData:
#readStringClipboardData
#readByteStringClipboardData
#readWideStringClipboardData
#clearClipboard

Not yet used in Squeak's text editors. See Clipboard.

=============== Diff against System-eem.1390 ===============

Item was changed:
  SystemOrganization addCategory: #'System-Applications'!
  SystemOrganization addCategory: #'System-Change Notification'!
  SystemOrganization addCategory: #'System-Changes'!
  SystemOrganization addCategory: #'System-Digital Signatures'!
  SystemOrganization addCategory: #'System-Download'!
  SystemOrganization addCategory: #'System-Exceptions'!
  SystemOrganization addCategory: #'System-FilePackage'!
  SystemOrganization addCategory: #'System-FileRegistry'!
  SystemOrganization addCategory: #'System-Finalization'!
  SystemOrganization addCategory: #'System-Localization'!
  SystemOrganization addCategory: #'System-Object Events'!
  SystemOrganization addCategory: #'System-Object Storage'!
  SystemOrganization addCategory: #'System-Preferences'!
  SystemOrganization addCategory: #'System-Recovery'!
  SystemOrganization addCategory: #'System-Serial Port'!
  SystemOrganization addCategory: #'System-Support'!
  SystemOrganization addCategory: #'System-Tools'!
+ SystemOrganization addCategory: #'System-Clipboard'!

Item was changed:
  Object subclass: #Clipboard
  	instanceVariableNames: 'contents recent interpreter'
  	classVariableNames: 'Default'
  	poolDictionaries: ''
+ 	category: 'System-Clipboard'!
- 	category: 'System-Support'!
  
  !Clipboard commentStamp: 'fbs 6/15/2013 16:20' prior: 0!
  The Clipboard class implements a basic buffering scheme for text. The currently selected text is also exported to the OS so that text can be copied from and to other applications. Commonly only a single instance is used (the default clipboard) but applications are free to use other than the default clipboard if necessary.
  
  If you'd like to be notified of the changes of the clipboard, you can subscribe to its #contentChanged event. For example:
  
  subscriber := [ :newClipboardText :updateSource | 
  	Transcript show: ('Clipboard was updated by {1}, the new content is: {2}'
  		format: {
  			updateSource.
  			newClipboardText }); cr ].
  Clipboard default
  	when: #contentChanged
  	send: #value:value:
  	to: subscriber.
  
  At this point if you open a Transcript and copy or cut some text, then the message will appear on the Transcript. Make sure that there's a reference kept to subscriber, otherwise it will be garbage collected and no messages will appear.
  	
  To unsubscribe from the clipboard changes, just evaluate:
  
  Clipboard default removeActionsWithReceiver: subscriber!

Item was added:
+ Object subclass: #ExtendedClipboardInterface
+ 	instanceVariableNames: 'clipboard'
+ 	classVariableNames: 'Current WinClipboardTypes'
+ 	poolDictionaries: ''
+ 	category: 'System-Clipboard'!
+ ExtendedClipboardInterface class
+ 	instanceVariableNames: 'mimeTypeMap clipboardFormatMap'!
+ ExtendedClipboardInterface class
+ 	instanceVariableNames: 'mimeTypeMap clipboardFormatMap'!

Item was added:
+ ----- Method: ExtendedClipboardInterface class>>clipboardFormatMap (in category 'private') -----
+ clipboardFormatMap
+ 	^clipboardFormatMap!

Item was added:
+ ----- Method: ExtendedClipboardInterface class>>current (in category 'accessing') -----
+ current
+ 
+ 	| platform |
+ 	Current ifNil: [
+ 		platform := SmalltalkImage current platformName.
+ 		Current := (platform = 'unix'
+ 			ifTrue: [ExtendedClipboardUnixInterface new]
+ 			ifFalse: [platform = 'Win32'
+ 				ifTrue: [ExtendedClipboardWinInterface new]
+ 				ifFalse: [ExtendedClipboardMacInterface new]])].
+ 	^ Current!

Item was added:
+ ----- Method: ExtendedClipboardInterface class>>initialize (in category 'class initialization') -----
+ initialize
+ 	"ExtendedClipboardInterface initialize"
+ 	Current := nil.
+ 	Smalltalk
+ 		addToStartUpList: self;
+ 		addToShutDownList: self.!

Item was added:
+ ----- Method: ExtendedClipboardInterface class>>mimeTypeMap (in category 'private') -----
+ mimeTypeMap
+ 	^mimeTypeMap!

Item was added:
+ ----- Method: ExtendedClipboardInterface class>>shutDown: (in category 'system startup') -----
+ shutDown: quitting
+ !

Item was added:
+ ----- Method: ExtendedClipboardInterface class>>startUp: (in category 'system startup') -----
+ startUp: resuming
+ 	"The image is either being newly started (resuming is true), or it's just been snapshotted"
+ 
+ 	resuming ifTrue: [
+ 		Current := nil.
+ 		self current].!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>addClipboardData:dataFormat: (in category 'general-api-add') -----
+ addClipboardData: data dataFormat: aFormat
+ 	clipboard = 0 ifTrue: 
+ 		[Clipboard clipboardText: data asString.	
+ 		^self].
+ 	self primAddClipboardData: clipboard data: data dataFormat: aFormat.!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>addClipboardDataConvertFormToJPEG: (in category 'general-api-add') -----
+ addClipboardDataConvertFormToJPEG: aForm
+ 	
+ 	self useImageReadWriter: JPEGReadWriter2 
+ 		onForm: aForm 
+ 		addClipboardMethod: [:b | self addJPEGClipboardData: b].
+ !

Item was added:
+ ----- Method: ExtendedClipboardInterface>>addClipboardDataConvertFormToPNG: (in category 'general-api-add') -----
+ addClipboardDataConvertFormToPNG: aForm
+ 	
+ 	self useImageReadWriter: PNGReadWriter 
+ 		onForm: aForm 
+ 		addClipboardMethod: [:b | self addPNGClipboardData: b].
+ !

Item was added:
+ ----- Method: ExtendedClipboardInterface>>addClipboardDataResolveCorrectType: (in category 'general-api-add') -----
+ addClipboardDataResolveCorrectType: data
+ 	^data class addClipboardDataResolveCorrectType: data!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>addJPEGClipboardData: (in category 'general-api-add') -----
+ addJPEGClipboardData: data
+ 	^self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>addPNGClipboardData: (in category 'general-api-add') -----
+ addPNGClipboardData: data
+ 	"I'm not sure the proper way of default behavior, though, now I made it blank to avoid a temporary error. -- 6/28/2007 tak"
+ 	"Do nothing"!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>addRTFClipboardData: (in category 'general-api-add') -----
+ addRTFClipboardData: data
+ 	^self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>addStringClipboardData: (in category 'general-api-add') -----
+ addStringClipboardData: data
+ 	^self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>addTextClipboardData: (in category 'general-api-add') -----
+ addTextClipboardData: data
+ 	^self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>addWideStringClipboardData: (in category 'general-api-add') -----
+ addWideStringClipboardData: data
+ 	^self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>clearClipboard (in category 'general-api-utility') -----
+ clearClipboard
+ 
+ 	self isAvailable ifTrue: [self primClearClipboard: clipboard].!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>clipboardMimeTypeExists: (in category 'testing') -----
+ clipboardMimeTypeExists: mimeType
+ 	| availableFormats |
+ 	availableFormats := self readAvailableFormats.
+ 	^availableFormats includes: mimeType!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>getClipboardFormat: (in category 'general-api-utility') -----
+ getClipboardFormat: lastFormat
+ 	"Answer next available format in the clipboard *after* lastFormat. Typically starts with 0 or a format you already know is there."
+ 	
+ 	^ self isAvailable
+ 		ifTrue: [self primGetClipboardFormat: clipboard formatNumber: lastFormat]
+ 		ifFalse: [nil]!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>hasClipboardData: (in category 'general-api-utility') -----
+ hasClipboardData: format
+ 
+ 	^ self isAvailable
+ 		ifTrue: [self primHasClipboardData: clipboard inFormat: format]
+ 		ifFalse: [false]!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>initialize (in category 'initialize-release') -----
+ initialize
+ 
+ 	super initialize.
+ 
+ 	clipboard := [self primCreateClipboard]
+ 		on: Error
+ 		do: [:ex | clipboard := 0].!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>isAvailable (in category 'testing') -----
+ isAvailable
+ 
+ 	^ clipboard ~= 0!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>primAddClipboardData:data:dataFormat: (in category 'system primitives') -----
+ primAddClipboardData: clipboard "<Integer>" data: data "<ByteArray>" dataFormat: aFormat "<Integer | ByteArray>"
+ 	<primitive:'ioAddClipboardData' module: 'ClipboardExtendedPlugin'>
+ 	self primitiveFailed!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>primClearClipboard: (in category 'system primitives') -----
+ primClearClipboard: clipboard "<Integer>"
+ 	<primitive:'ioClearClipboard' module: 'ClipboardExtendedPlugin'>
+ 	self primitiveFailed.!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>primCreateClipboard (in category 'system primitives') -----
+ primCreateClipboard "^<Integer>"
+ 	<primitive:'ioCreateClipboard' module: 'ClipboardExtendedPlugin'>
+ 	^ self primitiveFailed
+ !

Item was added:
+ ----- Method: ExtendedClipboardInterface>>primGetClipboardFormat:formatNumber: (in category 'system primitives') -----
+ primGetClipboardFormat: clipboard "<Integer>" formatNumber: formatNumber "<Integer> ^<Integer>"
+ 	"Enumerate available formats in the clipboard."
+ 	<primitive:'ioGetClipboardFormat' module: 'ClipboardExtendedPlugin'>
+ 	^ self primitiveFailed.
+ !

Item was added:
+ ----- Method: ExtendedClipboardInterface>>primHasClipboardData:inFormat: (in category 'system primitives') -----
+ primHasClipboardData: clipboard "<Integer>" inFormat: format "<Integer | ByteArray> ^<Boolean>"
+ 	<primitive:'ioHasClipboardDataInFormat' module: 'ClipboardExtendedPlugin'>
+ 	^ self primitiveFailed
+ !

Item was added:
+ ----- Method: ExtendedClipboardInterface>>primReadClipboardData:format: (in category 'system primitives') -----
+ primReadClipboardData: clipboard "<Integer>" format: format "<Integer | ByteArray> ^<ByteArray>"
+ 	<primitive:'ioReadClipboardData' module: 'ClipboardExtendedPlugin'>
+ 	^ self primitiveFailed
+ !

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readBMPClipboardData (in category 'general-api-read') -----
+ readBMPClipboardData
+ 	^ self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readByteStringClipboardData (in category 'general-api-read') -----
+ readByteStringClipboardData
+ 	^ self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readClipboardData: (in category 'general-api-read') -----
+ readClipboardData: format
+ 	^clipboard = 0 ifFalse: 
+ 		[self primReadClipboardData: clipboard format: format].!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readFormClipboardData (in category 'general-api-read') -----
+ readFormClipboardData
+ 	^ nil!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readJPEGClipboardData (in category 'general-api-read') -----
+ readJPEGClipboardData
+ 	^ self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readPNGClipboardData (in category 'general-api-read') -----
+ readPNGClipboardData
+ 	^ self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readRTFClipboardData (in category 'general-api-read') -----
+ readRTFClipboardData
+ 	^ self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readStringClipboardData (in category 'general-api-read') -----
+ readStringClipboardData
+ 	^ self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readTIFFClipboardData (in category 'general-api-read') -----
+ readTIFFClipboardData
+ 	^ self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readTextClipboardData (in category 'general-api-read') -----
+ readTextClipboardData
+ 	^ nil!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>readWideStringClipboardData (in category 'general-api-read') -----
+ readWideStringClipboardData
+ 	^ self subclassResponsibility!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>setTextString: (in category 'general-api-utility') -----
+ setTextString: aString
+ 	Smalltalk at: #CClipboard ifPresent: [:c | c clipboardText: aString]!

Item was added:
+ ----- Method: ExtendedClipboardInterface>>useImageReadWriter:onForm:addClipboardMethod: (in category 'general-api-add') -----
+ useImageReadWriter: aImageReadWriterClass onForm: aForm addClipboardMethod: aAddClipBoardBlock
+ 	| estimate buffer stream pngConverter |
+ 	(aForm isKindOf: Form) ifTrue: 
+ 		[estimate := (aForm extent x)*(aForm extent y).
+ 		estimate := 1024 max: (estimate * 4 * 3 // 4).
+ 		buffer := ByteArray new: estimate.
+ 		stream := (RWBinaryOrTextStream on: buffer) binary .
+ 		pngConverter := aImageReadWriterClass on: stream.
+ 		pngConverter nextPutImage: aForm.
+ 		pngConverter close.	
+ 		aAddClipBoardBlock value: stream contents].
+ 		
+ !

Item was added:
+ ExtendedClipboardInterface subclass: #ExtendedClipboardMacInterface
+ 	instanceVariableNames: ''
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'System-Clipboard'!

Item was added:
+ ----- Method: ExtendedClipboardMacInterface class>>initialize (in category 'class initialization') -----
+ initialize
+ 	"ExtendedClipboardMacInterface initialize"
+  
+ 	self
+ 		initializeClipboardFormatMap; 
+ 		initializeMimeTypeMap!

Item was added:
+ ----- Method: ExtendedClipboardMacInterface class>>initializeClipboardFormatMap (in category 'class initialization') -----
+ initializeClipboardFormatMap
+ 	"ExtendedClipboardMacInterface initializeClipboardFormatMap"
+ 
+ 	clipboardFormatMap := Dictionary new.
+ 	clipboardFormatMap
+ 		at: 'public.rtf' put: 'text/rtf' asMIMEType; 
+ 		at: 'com.apple.traditional-mac-plain-text' put: 'text/plain' asMIMEType;
+ 		at: 'public.png' put: 'image/png' asMIMEType;
+ 		at: 'public.jpeg' put: 'image/jpeg' asMIMEType; 
+ 		at: 'public.tiff' put: 'image/tiff' asMIMEType; 
+ 		at: 'public.utf16-plain-text' put: 'text/unicode' asMIMEType;
+ 		at: 'public.utf8-plain-text' put: 'text/utf8-unicode' asMIMEType;
+ 		yourself
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface class>>initializeMimeTypeMap (in category 'class initialization') -----
+ initializeMimeTypeMap
+ 	"ExtendedClipboardWinInterface initializeMimeTypeMap"
+ 
+ 	mimeTypeMap := Dictionary new.
+ 	mimeTypeMap
+ 		at: 'text/rtf' asMIMEType put: 'public.rtf'; 
+ 		at: 'text/*' asMIMEType put: 'com.apple.traditional-mac-plain-text';
+ 		at: 'image/jpeg' asMIMEType put: 'public.jpeg';
+ 		at: 'image/png' asMIMEType put: 'public.png';
+ 		at: 'text/unicode' asMIMEType put: 'public.utf8-plain-text';
+ 		yourself
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>addJPEGClipboardData: (in category 'general-api-add') -----
+ addJPEGClipboardData: data
+ 	self clearClipboard.
+ 	self addClipboardData: data dataFormat: 'public.jpeg'
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>addPNGClipboardData: (in category 'general-api-add') -----
+ addPNGClipboardData: data
+ 	self clearClipboard.
+ 	self addClipboardData: data dataFormat: 'public.png'
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>addRTFClipboardData: (in category 'general-api-add') -----
+ addRTFClipboardData: data
+ 	self clearClipboard.
+ 	self addClipboardData: data dataFormat: 'public.rtf'
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>addStringClipboardData: (in category 'general-api-add') -----
+ addStringClipboardData: data
+ 	self clearClipboard.
+ 	self addClipboardData: data dataFormat: 'public.text'
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>addTextClipboardData: (in category 'general-api-add') -----
+ addTextClipboardData: data
+ 	| buffer stream |
+ 	self clearClipboard.
+ 	self addClipboardData: data asString dataFormat: 'public.text'.
+ 	self halt.
+ 	buffer := ByteArray new: 2048.
+ 	stream := (RWBinaryOrTextStream on: buffer) binary .
+ 	data serializeOn:  stream.
+ 	self addClipboardData: (buffer copyFrom: 1 to: stream size) dataFormat: 'org.squeak.text'.
+  
+ 
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>addUF8StringClipboardData: (in category 'general-api-add') -----
+ addUF8StringClipboardData: aString
+ 	| ba  |
+ 
+ 	self clearClipboard.
+ 	ba := aString convertToWithConverter: (UTF8TextConverter new).
+ 	self addClipboardData: ba dataFormat: 'public.utf8-plain-text'
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>addWideStringClipboardData: (in category 'general-api-add') -----
+ addWideStringClipboardData: aString
+ 	| ba  |
+ 
+ 	self clearClipboard.
+ 	ba := aString convertToWithConverter: (UTF16TextConverter new useByteOrderMark: true).
+ 	self addClipboardData: ba dataFormat: 'public.utf16-plain-text'
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readAvailableFormats (in category 'general-api-read') -----
+ readAvailableFormats
+ 	| currentFormat availableFormats mimeType formatData |
+ 	availableFormats := OrderedCollection new: 10.
+ 	currentFormat := 1.
+ 	[formatData := self getClipboardFormat: currentFormat.
+ 	formatData notNil]
+ 		whileTrue: [
+ 			mimeType := self class clipboardFormatMap at: formatData asString ifAbsent: [nil].
+ 			mimeType ifNotNil: [
+ 				availableFormats add: mimeType].
+ 		currentFormat := currentFormat +1].
+ 	^availableFormats!

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readByteStringClipboardData (in category 'general-api-read') -----
+ readByteStringClipboardData
+ 	^(self readClipboardData: 'com.apple.traditional-mac-plain-text')
+ 		ifNotNil: [: bytes | bytes asString macToSqueak]
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readFormClipboardData (in category 'general-api-read') -----
+ readFormClipboardData
+ 	| bytes formats |
+ 	formats := self readAvailableFormats.
+ 	(formats includes: 'image/png' asMIMEType)
+ 		ifTrue: [bytes := self readPNGClipboardData.
+ 			^ (PNGReadWriter on: bytes readStream) nextImage].
+ 	(formats includes: 'image/jpeg' asMIMEType)
+ 		ifTrue: [bytes := self readJPEGClipboardData.
+ 			^ (JPEGReadWriter2 on: bytes readStream) nextImage].
+ 	^ nil!

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readJPEGClipboardData (in category 'general-api-read') -----
+ readJPEGClipboardData
+ 	| bytes |
+ 	bytes := self readClipboardData: 'public.jpeg'.
+ 	^bytes
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readPNGClipboardData (in category 'general-api-read') -----
+ readPNGClipboardData
+ 	| bytes |
+ 	bytes := self readClipboardData: 'public.png'.
+ 	^bytes
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readRTFClipboardData (in category 'general-api-read') -----
+ readRTFClipboardData
+ 	| bytes |
+ 	bytes := self readClipboardData: 'public.rtf'.
+ 	^bytes ifNil: [bytes] ifNotNil: [bytes asString]
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readStringClipboardData (in category 'general-api-read') -----
+ readStringClipboardData
+ 	| string |
+ 	string := self readUTF8StringClipboardData.
+ 	string ifNil: [string := self readWideStringClipboardData].
+ 	string ifNil: [string := self readByteStringClipboardData].
+ 	^string
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readTIFFClipboardData (in category 'general-api-read') -----
+ readTIFFClipboardData
+ 	| bytes |
+ 	bytes := self readClipboardData: 'public.tiff'.
+ 	^bytes
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readTextClipboardData (in category 'general-api-read') -----
+ readTextClipboardData
+ 	^self readStringClipboardData
+ 		ifNotNil: [:string | (string replaceAll: Character lf with: Character cr) asText]
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readUTF8StringClipboardData (in category 'general-api-read') -----
+ readUTF8StringClipboardData
+ 	^(self readClipboardData: 'public.utf8-plain-text')
+ 		ifNotNil: [:bytes |
+ 			[bytes asString utf8ToSqueak] ifError: [bytes asString] ]
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>readWideStringClipboardData (in category 'general-api-read') -----
+ readWideStringClipboardData
+ 	| bytes |
+ 	"utf16 plain text has no bom"
+ 
+ 	bytes := self readClipboardData: 'public.utf16-plain-text'.
+ 	^bytes ifNil: [bytes] ifNotNil: 
+ 		[bytes asString convertFromWithConverter: (UTF16TextConverter new useLittleEndian: (SmalltalkImage current endianness = #little)
+ )]
+ !

Item was added:
+ ----- Method: ExtendedClipboardMacInterface>>setTextString: (in category 'general-api-utility') -----
+ setTextString: aString
+ 	super setTextString: aString.
+ 	aString isWideString
+ 		ifTrue: [self addUF8StringClipboardData: aString].
+ 	Smalltalk at: #MacServicesInterface ifPresent: [:c | c current setTextString: aString].!

Item was added:
+ ExtendedClipboardInterface subclass: #ExtendedClipboardUnixInterface
+ 	instanceVariableNames: ''
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'System-Clipboard'!

Item was added:
+ ----- Method: ExtendedClipboardUnixInterface>>addPNGClipboardData: (in category 'general-api-add') -----
+ addPNGClipboardData: data
+ 	self clearClipboard.
+ 	self addClipboardData: data dataFormat: 'image/png'
+ !

Item was added:
+ ----- Method: ExtendedClipboardUnixInterface>>readAvailableFormats (in category 'general-api-read') -----
+ readAvailableFormats
+ 	| currentFormat availableFormats mimeType formatData |
+ 	availableFormats := OrderedCollection new: 10.
+ 	currentFormat := 1.
+ 	[formatData := self getClipboardFormat: currentFormat.
+ 	formatData notNil]
+ 		whileTrue: [
+ 			"mimeType := self class clipboardFormatMap at: formatData asString ifAbsent: [nil]".
+ 			mimeType := formatData.
+ 			mimeType ifNotNil: [
+ 				availableFormats add: mimeType].
+ 		currentFormat := currentFormat +1].
+ 	^availableFormats!

Item was added:
+ ----- Method: ExtendedClipboardUnixInterface>>readFormClipboardData (in category 'general-api-read') -----
+ readFormClipboardData
+ 	| bytes formats |
+ 	formats := self readAvailableFormats.
+ 	(formats includes: 'image/png')
+ 		ifTrue: [bytes := self readClipboardData: 'image/png'.
+ 			^ (PNGReadWriter on: bytes readStream) nextImage].
+ 	(formats includes: 'image/bmp')
+ 		ifTrue: [bytes := self readClipboardData: 'image/bmp'.
+ 			^ (BMPReadWriter on: bytes readStream) nextImage].
+ 	^ nil!

Item was added:
+ ----- Method: ExtendedClipboardUnixInterface>>readHTMLClipboardData (in category 'general-api-read') -----
+ readHTMLClipboardData
+ 	| bytes source |
+ 	"Answer a HTMLDocument object"
+ 	bytes := self readClipboardData: 'text/html'.
+ 	(bytes beginsWith: '<!!DOCTYPE' asByteArray)
+ 		ifTrue: ["BAD HACK for Abiword"
+ 			source := bytes asString convertFromWithConverter: UTF8TextConverter new]
+ 		ifFalse: ["BAD HACK for mozilla"
+ 			source := bytes asString
+ 						convertFromWithConverter: (UTF16TextConverter new useLittleEndian: SmalltalkImage current isLittleEndian)].
+ 	^ HtmlParser parse: source readStream!

Item was added:
+ ----- Method: ExtendedClipboardUnixInterface>>readStringClipboardData (in category 'general-api-read') -----
+ readStringClipboardData
+ 	^self readWideStringClipboardData!

Item was added:
+ ----- Method: ExtendedClipboardUnixInterface>>readTextClipboardData (in category 'general-api-read') -----
+ readTextClipboardData
+ 	| formats |
+ 	formats := self readAvailableFormats.
+ 	(formats includes: 'text/html')
+ 		ifTrue: [^ self readHTMLClipboardData formattedText].
+ 	(formats includes: 'UTF8_STRING')
+ 		ifTrue: [^self readWideStringClipboardData asText].
+ 	(formats includes: 'STRING')
+ 		ifTrue: ["handled by old clipboard code, fall through"].
+ 	^ nil!

Item was added:
+ ----- Method: ExtendedClipboardUnixInterface>>readWideStringClipboardData (in category 'general-api-read') -----
+ readWideStringClipboardData
+ 	^(self readClipboardData: 'UTF8_STRING') asString utf8ToSqueak!

Item was added:
+ ExtendedClipboardInterface subclass: #ExtendedClipboardWinInterface
+ 	instanceVariableNames: ''
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'System-Clipboard'!

Item was added:
+ ----- Method: ExtendedClipboardWinInterface class>>initialize (in category 'class initialization') -----
+ initialize
+ 	"ExtendedClipboardWinInterface initialize"
+ 
+ 	self
+ 		initializeClipboardFormatMap;
+ 		initializeMimeTypeMap!

Item was added:
+ ----- Method: ExtendedClipboardWinInterface class>>initializeClipboardFormatMap (in category 'class initialization') -----
+ initializeClipboardFormatMap
+ 	"ExtendedClipboardWinInterface initializeClipboardFormatMap"
+ 
+ 	clipboardFormatMap := Dictionary new.
+ 	"at: 6 put: 'image/tiff' asMIMEType; CF_TIFF"
+ 
+ 	clipboardFormatMap
+ 		at: 49510 put: 'text/rtf' asMIMEType; 
+ 		at: 1 put: 'text/plain' asMIMEType; "CF_TEXT"
+ 		at: 2 put: 'image/bmp' asMIMEType; "CF_BITMAP"
+ 		at: 12 put: 'audio/wave'; "CF_WAVE"
+ 		at: 13 put: 'text/unicode' asMIMEType; "CF_UNICODETEXT"
+ 		at: 16 put: 'CF_LOCALE'; "CF_LOCALE"
+ 		yourself.
+ 
+ 
+ !

Item was added:
+ ----- Method: ExtendedClipboardWinInterface class>>initializeMimeTypeMap (in category 'class initialization') -----
+ initializeMimeTypeMap
+ 	"ExtendedClipboardWinInterface initializeMimeTypeMap"
+ 
+ 	mimeTypeMap := Dictionary new.
+ 	mimeTypeMap
+ 		at: 'text/rtf' asMIMEType put: 49510; 
+ 		at: 'text/plain' asMIMEType put: 1; "CF_TEXT"
+ 		at: 'image/*' asMIMEType put: 2; "CF_BITMAP"
+ 		at: 'metafile' put: 3; "CF_METAFILEPICT"
+ 		at: 'CF_SYLK' put: 4; "CF_SYLK"
+ 		at: 'CF_DIF' put: 5; "CF_DIF"
+ 		at: 'image/tiff' asMIMEType put: 6; "CF_TIFF"
+ 		at: 'oemtext' put: 7; "CF_OEMTEXT"
+ 		at: 'CF_DIB' put: 8; "CF_DIB"
+ 		at: 'CF_PALETTE' put: 9; "CF_PALETTE"
+ 		at: 'CF_PENDATA' put: 10; "CF_PENDATA"
+ 		at: 'CF_RIFF' put: 11; "CF_RIFF"
+ 		at: 'wave' put: 12; "CF_WAVE"
+ 		at: 'text/unicode' asMIMEType put: 13; "CF_UNICODETEXT"
+ 		at: 'CF_ENHMETAFILE' put: 14; "CF_ENHMETAFILE"
+ 		at: 'CF_HDROP' put: 15; "CF_HDROP"
+ 		at: 'CF_LOCALE' put: 16; "CF_LOCALE"
+ 		at: 'CF_DIBV5' put: 17; "CF_DIBV5"
+ 		yourself
+ !

Item was added:
+ ----- Method: ExtendedClipboardWinInterface>>readAvailableFormats (in category 'general-api-read') -----
+ readAvailableFormats
+ 	
+ 	| lastFormat availableFormats |
+ 	availableFormats := OrderedCollection new: 10.
+ 	lastFormat := 0.
+ 	[(lastFormat := self getClipboardFormat: lastFormat) notNil]
+ 		whileTrue: [
+ 			(self class clipboardFormatMap at: lastFormat ifAbsent: [nil])
+ 				ifNotNil: [:mimeType | availableFormats add: mimeType]].
+ 	^ availableFormats!

Item was added:
+ ----- Method: ExtendedClipboardWinInterface>>readBMPClipboardData (in category 'general-api-read') -----
+ readBMPClipboardData
+ 	| string |
+ 	self openClipboard.
+ 	[string := (self getClipboardData: (self class mimeTypeMap at: 'image/*' asMIMEType)) fromCString]
+ 		ensure: [self closeClipboard].
+ 	^string!

Item was added:
+ ----- Method: ExtendedClipboardWinInterface>>readByteStringClipboardData (in category 'general-api-read') -----
+ readByteStringClipboardData
+ 
+ 	(self hasClipboardData: 1) "CF_TEXT"
+ 		ifFalse: [^ nil].
+ 	
+ 	^ (self readClipboardData: 1) "CF_TEXT" asString!

Item was added:
+ ----- Method: ExtendedClipboardWinInterface>>readFormClipboardData (in category 'general-api-read') -----
+ readFormClipboardData
+ 	| bytes formats |
+ 	formats := self readAvailableFormats.
+ 	(formats includes: 'image/bmp' asMIMEType)
+ 		ifTrue: [bytes := self readBMPClipboardData.
+ 			^ (BMPReadWriter on: bytes readStream) nextImage].
+ 	^ nil!

Item was added:
+ ----- Method: ExtendedClipboardWinInterface>>readRTFClipboardData (in category 'general-api-read') -----
+ readRTFClipboardData
+ 	| string |
+ 	self openClipboard.
+ 	[string := (self getClipboardData: (self class mimeTypeMap at: 'text/rtf' asMIMEType)) fromCString]
+ 		ensure: [self closeClipboard].
+ 	^string!

Item was added:
+ ----- Method: ExtendedClipboardWinInterface>>readStringClipboardData (in category 'general-api-read') -----
+ readStringClipboardData
+ 
+ 	^ self readWideStringClipboardData
+ 		ifNil: [self readByteStringClipboardData]!

Item was added:
+ ----- Method: ExtendedClipboardWinInterface>>readTIFFClipboardData (in category 'general-api-read') -----
+ readTIFFClipboardData
+ 	| string |
+ 	self openClipboard.
+ 	[string := (self getClipboardData: (self class mimeTypeMap at: 'image/tiff' asMIMEType)) fromCString]
+ 		ensure: [self closeClipboard].
+ 	^string!

Item was added:
+ ----- Method: ExtendedClipboardWinInterface>>readWideStringClipboardData (in category 'general-api-read') -----
+ readWideStringClipboardData
+ 
+ 	(self hasClipboardData: 13) "CF_UNICODETEXT"
+ 		ifFalse: [^ nil].
+ 	
+ 	"HACK!! Use CF_PRIVATELAST to handle UTF16-encoded UTF8. See platform code."
+ 	^ (self readClipboardData: 16r02FF) "CF_PRIVATELAST"
+ 		ifNotNil: [:bytes | [bytes asString utf8ToSqueak] ifError: [bytes asString] ]!



More information about the Squeak-dev mailing list