[squeak-dev] The Inbox: Tools-mt.536.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Mar 1 20:35:49 UTC 2015


Marcel Taeumel uploaded a new version of Tools to project The Inbox:
http://source.squeak.org/inbox/Tools-mt.536.mcz

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

Name: Tools-mt.536
Author: mt
Time: 1 March 2015, 9:35:39.627 pm
UUID: 1ab7460c-c7be-f647-a881-9bca8ab6e605
Ancestors: Tools-mt.535

NEW TOOL: Object Collection Tool

Drag and drop classes or methods from the browser into it to open mini-editors in a list. Dropping morphs will open an object explorer for that morph.

ObjectCollectionTool open.

=============== Diff against Tools-mt.535 ===============

Item was added:
+ Morph subclass: #ObjectCollectionItem
+ 	instanceVariableNames: 'object'
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'Tools-Browser'!

Item was added:
+ ----- Method: ObjectCollectionItem class>>on:object: (in category 'instance creation') -----
+ on: aMorph object: anObject
+ 
+ 	aMorph
+ 		hResizing: #spaceFill;
+ 		vResizing: #spaceFill.
+ 	
+ 	^ self new
+ 		object: anObject;
+ 		addMorphFront: aMorph;
+ 		yourself!

Item was added:
+ ----- Method: ObjectCollectionItem>>fastFramingOn (in category 'compatibility') -----
+ fastFramingOn
+ 	"Compatibility with system window interface. Needed by grip morphs."
+ 	
+ 	^ false!

Item was added:
+ ----- Method: ObjectCollectionItem>>initialize (in category 'initialization') -----
+ initialize
+ 
+ 	super initialize.
+ 	self
+ 		height: 200;
+ 		color: Color transparent;
+ 		layoutPolicy: TableLayout new;
+ 		listDirection: #topToBottom;
+ 		hResizing: #spaceFill;
+ 		vResizing: #rigid.
+ 
+ 	self addMorph: (BottomGripMorph new target: self).!

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

Item was added:
+ ----- Method: ObjectCollectionItem>>object: (in category 'accessing') -----
+ object: anObject
+ 
+ 	object := anObject.!

Item was added:
+ Morph subclass: #ObjectCollectionPane
+ 	instanceVariableNames: 'model'
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'Tools-Browser'!

Item was added:
+ ----- Method: ObjectCollectionPane>>acceptDroppingMorph:event: (in category 'drag and drop') -----
+ acceptDroppingMorph: aMorph event: evt
+ 
+ 	self model
+ 		acceptDroppingMorph: aMorph
+ 		event: evt
+ 		inMorph: self.!

Item was added:
+ ----- Method: ObjectCollectionPane>>adoptPaneColor: (in category 'accessing') -----
+ adoptPaneColor: c
+ 
+ 	self
+ 		color: c;
+ 		borderColor: c darker darker.
+ 		
+ 	super adoptPaneColor: c.!

Item was added:
+ ----- Method: ObjectCollectionPane>>drawOn: (in category 'initialization') -----
+ drawOn: aCanvas
+ 
+ 	super drawOn: aCanvas.
+ 
+ 	('Drop objects here or in-between. Close editors with CMD+W.' asText
+ 		addAttribute: (TextColor color: self borderStyle color darker);
+ 		asMorph)
+ 			center: (self center x @ (self bottom - 10));
+ 			drawOn: aCanvas.!

Item was added:
+ ----- Method: ObjectCollectionPane>>initialize (in category 'initialization') -----
+ initialize
+ 
+ 	super initialize.
+ 	self
+ 		height: 200;
+ 		layoutPolicy: TableLayout new;
+ 		layoutInset: (0 at 0 corner: 0 at 25);
+ 		listDirection: #topToBottom;
+ 		hResizing: #spaceFill;
+ 		vResizing: #shrinkWrap;
+ 		dropEnabled: true.!

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

Item was added:
+ ----- Method: ObjectCollectionPane>>model: (in category 'accessing') -----
+ model: anObjectCollectionTool
+ 
+ 	model := anObjectCollectionTool.!

Item was added:
+ ----- Method: ObjectCollectionPane>>removedMorph: (in category 'submorphs-add/remove') -----
+ removedMorph: anItem
+ 
+ 	self model removeObject: anItem object.!

Item was added:
+ ----- Method: ObjectCollectionPane>>submorphAt: (in category 'submorphs-accessing') -----
+ submorphAt: position
+ 
+ 	^ (self morphsAt: position) 
+ 		detect: [:m | self submorphs includes: m]
+ 		ifNone: []!

Item was added:
+ ----- Method: ObjectCollectionPane>>wantsDroppedMorph:event: (in category 'drag and drop') -----
+ wantsDroppedMorph: aMorph event: evt
+ 
+ 	^ self model
+ 		wantsDroppedMorph: aMorph
+ 		event: evt
+ 		inMorph: self!

Item was added:
+ Model subclass: #ObjectCollectionTool
+ 	instanceVariableNames: 'objects'
+ 	classVariableNames: ''
+ 	poolDictionaries: ''
+ 	category: 'Tools-Browser'!

Item was added:
+ ----- Method: ObjectCollectionTool class>>open (in category 'instance creation') -----
+ open
+ 
+ 	^ (ToolBuilder open: self new) model!

Item was added:
+ ----- Method: ObjectCollectionTool class>>windowColorSpecification (in category 'instance creation') -----
+ windowColorSpecification
+ 	"WindowColorRegistry refresh."
+ 	
+ 	^ WindowColorSpec
+ 		classSymbol: self name
+ 		wording: 'Object Collection Tool'
+ 		brightColor: #lightGreen
+ 		pastelColor: #paleGreen
+ 		helpMessage: ''!

Item was added:
+ ----- Method: ObjectCollectionTool>>acceptDroppingMorph:event:inMorph: (in category 'drag and drop') -----
+ acceptDroppingMorph: transferMorph event: dropEvent inMorph: collectionPane
+ 
+ 	| object |
+ 	object := (transferMorph respondsTo: #passenger)
+ 			ifTrue: [transferMorph passenger]
+ 			ifFalse: [transferMorph].
+ 	self
+ 		buildWidgetFor: object
+ 		then: [:widget |
+ 			(ObjectCollectionItem on: widget object: object) in: [:newItem |
+ 				(collectionPane submorphAt: dropEvent position) 
+ 					ifNil: [collectionPane addMorphBack: newItem]
+ 					ifNotNil: [:m |
+ 						dropEvent position y < m center y
+ 							ifTrue: [collectionPane addMorph: newItem inFrontOf: m]
+ 							ifFalse: [collectionPane addMorph: newItem behind: m]] ].
+ 			self addObject: object].
+ 
+ 	.!

Item was added:
+ ----- Method: ObjectCollectionTool>>addObject: (in category 'accessing - objects') -----
+ addObject: anObject
+ 
+ 	self objects add: anObject.
+ 	self changed: #labelString !

Item was added:
+ ----- Method: ObjectCollectionTool>>buildWidgetFor:then: (in category 'widgets') -----
+ buildWidgetFor: anObject then: actionBlock
+ 
+ 	(anObject isKindOf: CompiledMethod)
+ 		ifTrue: [^ self buildWidgetForCompiledMethod: anObject then: actionBlock].
+ 	(anObject isKindOf: ClassDescription)
+ 		ifTrue: [^ self buildWidgetForClassDescription: anObject then: actionBlock].
+ 
+ 	self buildWidgetForObject: anObject then: actionBlock.!

Item was added:
+ ----- Method: ObjectCollectionTool>>buildWidgetForClassDescription:then: (in category 'widgets') -----
+ buildWidgetForClassDescription: cls then: actionBlock
+ 
+ 	| builder spec menu |
+ 	menu := MenuMorph new
+ 		defaultTarget: [:symbol |
+ 			builder := ToolBuilder default.
+ 			spec := Browser new
+ 				selectSystemCategory: cls category;
+ 				selectClass: cls;
+ 				metaClassIndicated: (symbol = #meta);
+ 				editSelection: #editClass;
+ 				buildCodePaneWith: builder.
+ 			actionBlock value: (builder build: spec)];
+ 		
+ 		add: cls theNonMetaClass name selector: #value: argument: #nonMeta;
+ 		add: cls theMetaClass name selector: #value: argument: #meta;
+ 		popUpAt: self currentEvent position forHand: self currentHand in: self currentWorld.
+ 	
+ 	"We need to trick the window, which will overlap the menu here."
+ 	Project current addDeferredUIMessage:[menu comeToFront].!

Item was added:
+ ----- Method: ObjectCollectionTool>>buildWidgetForCompiledMethod:then: (in category 'widgets') -----
+ buildWidgetForCompiledMethod: method then: actionBlock
+ 
+ 	| builder spec |
+ 	builder := ToolBuilder default.
+ 	spec := Browser new
+ 				selectSystemCategory: method methodClass category;
+ 				selectClass: method methodClass;
+ 				metaClassIndicated: method methodClass isMeta;
+ 				selectMessageNamed: method selector;
+ 				editSelection: #editMessage;
+ 				buildCodePaneWith: builder.
+ 	
+ 	"MethodHolder new
+ 		methodClass: method methodClass methodSelector: method selector;
+ 		buildCodePaneWith: builder."
+ 		
+ 	actionBlock value: (builder build: spec).!

Item was added:
+ ----- Method: ObjectCollectionTool>>buildWidgetForObject:then: (in category 'widgets') -----
+ buildWidgetForObject: anObject then: actionBlock
+ 	"Fall-back if nothing more special can be found."
+ 	
+ 	actionBlock value: (
+ 		"Get rid of the system window."
+ 		Morph new
+ 			changeProportionalLayout;
+ 			color: Color transparent;
+ 			addAllMorphs: (ObjectExplorer new explorerFor: Morph new) paneMorphs;
+ 			yourself).
+ !

Item was added:
+ ----- Method: ObjectCollectionTool>>buildWith: (in category 'toolbuilder') -----
+ buildWith: builder
+ 
+ 	| windowSpec scrollSpec morph |
+ 	windowSpec := builder pluggableWindowSpec new.
+ 	windowSpec
+ 		model: self;
+ 		label: #labelString;
+ 		children: OrderedCollection new.
+ 
+ 	scrollSpec := builder pluggableScrollPaneSpec new.
+ 	scrollSpec
+ 		name: #scrollPane;
+ 		model: self;
+ 		hScrollBarPolicy: #never;
+ 		vScrollBarPolicy: #whenNeeded;
+ 		borderWidth: 0;
+ 		morph: (ObjectCollectionPane new
+ 			model: self;
+ 			yourself);
+ 		frame: (0 at 0 corner: 1 at 1).
+ 	windowSpec children add: scrollSpec.
+ 
+ 	morph := builder build: windowSpec.
+ 
+ 	"Set the layout policy for the transform morph."
+ 	(builder widgetAt: #scrollPane) scroller
+ 		layoutPolicy: TableLayout new;
+ 		color: morph paneColor darker darker.
+ 	(builder widgetAt: #scrollPane) morph
+ 		color: morph paneColor.
+ 	ActiveHand addKeyboardListener: self.
+ 
+ 	^ morph!

Item was added:
+ ----- Method: ObjectCollectionTool>>defaultBackgroundColor (in category 'user interface') -----
+ defaultBackgroundColor
+ 
+ 	self flag: #refactor. "mt: Does not use the preference mechansim."
+ 	^ Color colorFrom: self class windowColorSpecification brightColor!

Item was added:
+ ----- Method: ObjectCollectionTool>>handleListenEvent: (in category 'events-processing') -----
+ handleListenEvent: anEvent
+ 
+ 	"Has something keyboard focus at all?"
+ 	anEvent hand keyboardFocus ifNil: [^ self].
+ 
+ 	"CMD+W?"
+ 	((anEvent isKeystroke
+ 		and: [anEvent commandKeyPressed])
+ 		and: [anEvent keyCharacter = $w])
+ 			ifFalse: [^ self].
+ 
+ 	"Has keyboard?"
+ 	(anEvent hand keyboardFocus firstOwnerSuchThat: [:m |
+ 		m isSystemWindow and: [m model == self]])
+ 			ifNil: [^ self].
+ 			
+ 	"Which item is it?"
+ 	(anEvent hand keyboardFocus firstOwnerSuchThat: [:m |
+ 		m owner class = ObjectCollectionPane]) delete.!

Item was added:
+ ----- Method: ObjectCollectionTool>>labelString (in category 'user interface') -----
+ labelString
+ 
+ 	^ 'Object Collection Tool ({1})' format: {self objects size}!

Item was added:
+ ----- Method: ObjectCollectionTool>>objects (in category 'accessing - objects') -----
+ objects
+ 
+ 	^ objects ifNil: [objects := OrderedCollection new]!

Item was added:
+ ----- Method: ObjectCollectionTool>>removeObject: (in category 'accessing - objects') -----
+ removeObject: anObject
+ 
+ 	self objects remove: anObject.
+ 	self changed: #labelString !

Item was added:
+ ----- Method: ObjectCollectionTool>>wantsDroppedMorph:event:inMorph: (in category 'drag and drop') -----
+ wantsDroppedMorph: transferMorph event: dropEvent inMorph: collectionPane
+ 
+ 	^ collectionPane dropEnabled!

Item was added:
+ ----- Method: ObjectCollectionTool>>windowIsClosing (in category 'updating') -----
+ windowIsClosing
+ 
+ 	ActiveHand removeKeyboardListener: self.!



More information about the Squeak-dev mailing list