[squeak-dev] The Inbox: Tools-fbs.488.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Jul 16 21:07:14 UTC 2013


A new version of Tools was added to project The Inbox:
http://source.squeak.org/inbox/Tools-fbs.488.mcz

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

Name: Tools-fbs.488
Author: fbs
Time: 16 July 2013, 10:06:56.902 pm
UUID: e1137155-1820-e948-b2b4-de2ae3dd0c4c
Ancestors: Tools-fbs.487

An initial stab at reimplementing ArchiveViewer's UI using ToolBuilder. It should all just work, but the lack of lining data up in columns is a serious UI concern.

The existing UI uses a monospaced font and spaces to achieve this. ToolBuilder doesn't allow for the setting of fonts (as far as I can tell). And really, what we want it a PluggableTableSpec.

=============== Diff against Tools-fbs.487 ===============

Item was added:
+ ----- Method: ArchiveViewer class>>morphicOpen (in category 'instance creation') -----
+ morphicOpen
+ 	^(self new) createWindow; openInWorld.!

Item was added:
+ ----- Method: ArchiveViewer class>>morphicOpenOn: (in category 'instance creation') -----
+ morphicOpenOn: aFileName
+ 	| newMe |
+ 	newMe := self new.
+ 	newMe createWindow; fileName: aFileName; openInWorld.
+ 	^newMe!

Item was changed:
  ----- Method: ArchiveViewer class>>open (in category 'instance creation') -----
  open
+ 	^ToolBuilder open: self new.!
- 	^(self new) createWindow; openInWorld.!

Item was changed:
  ----- Method: ArchiveViewer class>>openOn: (in category 'instance creation') -----
  openOn: aFileName
  	| newMe |
+ 	newMe := self new fileName: aFileName; yourself.
+ 	^ ToolBuilder open: (newMe buildWith: ToolBuilder default) label: aFileName.!
- 	newMe := self new.
- 	newMe createWindow; fileName: aFileName; openInWorld.
- 	^newMe!

Item was added:
+ ----- Method: ArchiveViewer>>buildButtonBar: (in category 'toolbuilder') -----
+ buildButtonBar: builder
+ 	| panelSpec |
+ 	panelSpec := builder pluggablePanelSpec new
+ 		layout: #horizontal;
+ 		children: OrderedCollection new;
+ 		frame: self buttonsFrame;
+ 		yourself.
+ 	
+ 	#(('new' #canCreateNewArchive #createNewArchive 'Create a new, empty archive and discard this one')
+ 		('load' #canOpenNewArchive #openNewArchive 'Open another archive and discard this one')
+ 		('save' #canSaveArchive #saveArchive 'Save this archive under a new name')
+ 		('extract' #canExtractAll #extractAll 'Extract all members into a directory')
+ 		('add' #canAddMember #addMember 'Add a file')
+ 		('add from clipboard' #canAddMember #addMemberFromClipboard 'Add the contents of the clipboard as a new file')
+ 		('add dir' #canAddMember #addDirectory 'Add a directory full of files')
+ 		('extract it' #canExtractMember #extractMember 'Extract selected member to a file')
+ 		('delete it' #canDeleteMember #deleteMember 'Remove selected member from archive')
+ 		('rename it' #canRenameMember #renameMember 'Rename selected member')
+ 		('view all' #canViewAllContents #changeViewAllContents 'Toggle the view of all the selected member''s contents')) do: [:arr | | buttonSpec |
+ 		buttonSpec := builder pluggableButtonSpec new
+ 			model: self;
+ 			label: arr first;
+ 			state: arr second;
+ 			action: arr third;
+ 			help: arr fourth
+ 			yourself.
+ 		panelSpec children addLast: buttonSpec].
+ 	^ panelSpec!

Item was added:
+ ----- Method: ArchiveViewer>>buildMemberTitle: (in category 'toolbuilder') -----
+ buildMemberTitle: builder
+ 	| textSpec |
+ 	textSpec := builder pluggableTextSpec new
+ 		model: self;
+ 		getText: #headerContents;
+ 		yourself.
+ 	^ textSpec.!

Item was added:
+ ----- Method: ArchiveViewer>>buildMemberViewer: (in category 'toolbuilder') -----
+ buildMemberViewer: builder
+ 	| listSpec |
+ 	listSpec := builder pluggableListSpec new
+ 		model: self;
+ 		list: #memberList;
+ 		getIndex: #memberIndex;
+ 		setIndex: #memberIndex:;
+ 		menu: #memberMenu:shifted:;
+ 		yourself.
+ 	^ listSpec!

Item was added:
+ ----- Method: ArchiveViewer>>buildPreviewer: (in category 'toolbuilder') -----
+ buildPreviewer: builder
+ 	| textSpec |
+ 	textSpec := builder pluggableCodePaneSpec new
+ 		model: self;
+ 		getText: #briefContents;
+ 		yourself.
+ 	^ textSpec!

Item was added:
+ ----- Method: ArchiveViewer>>buildWindowWith: (in category 'toolbuilder') -----
+ buildWindowWith: builder
+ 	| windowSpec |
+ 	windowSpec := builder pluggableWindowSpec new.
+ 	windowSpec model: self.
+ 	windowSpec label: #labelString.
+ 	windowSpec children: OrderedCollection new.
+ 	^windowSpec!

Item was added:
+ ----- Method: ArchiveViewer>>buildWindowWith:specs: (in category 'toolbuilder') -----
+ buildWindowWith: builder specs: specs
+ 	| windowSpec |
+ 	windowSpec := self buildWindowWith: builder.
+ 	specs do: [:assoc| | rect action widgetSpec |
+ 		rect := assoc key.
+ 		action := assoc value.
+ 		widgetSpec := action value.
+ 		widgetSpec ifNotNil: [
+ 			widgetSpec frame: rect.
+ 			windowSpec children add: widgetSpec]].
+ 	^ windowSpec!

Item was added:
+ ----- Method: ArchiveViewer>>buildWith: (in category 'toolbuilder') -----
+ buildWith: builder
+ 	| windowSpec |
+ 	windowSpec := self buildWindowWith: builder specs: {
+ 		(0 at 0 corner: 1 at 0.1) -> [self buildButtonBar: builder].
+ 		(0 at 0.1 corner: 1 at 0.2) -> [self buildMemberTitle: builder].
+ 		(0 at 0.2 corner: 1 at 0.75) -> [self buildMemberViewer: builder].
+ 		(0 at 0.75 corner: 1 at 1) -> [self buildPreviewer: builder].
+ 	}.
+ 	^ windowSpec.!

Item was added:
+ ----- Method: ArchiveViewer>>buttonHeight (in category 'toolbuilder') -----
+ buttonHeight
+ 	^Preferences standardButtonFont height + 12!

Item was added:
+ ----- Method: ArchiveViewer>>buttonsFrame (in category 'toolbuilder') -----
+ buttonsFrame
+ 	^LayoutFrame new
+ 		leftFraction: 0 offset: 0;
+ 		topFraction: 0 offset: 0;
+ 		rightFraction: 1 offset: 0;
+ 		bottomFraction: 0 offset: self buttonHeight!

Item was changed:
+ ----- Method: ArchiveViewer>>contents (in category 'accessing') -----
- ----- Method: ArchiveViewer>>contents (in category 'initialization') -----
  contents
  	| contents errorMessage |
  	self selectedMember ifNil: [^ ''].
  	viewAllContents ifFalse: [^ self briefContents].
  
   	[ contents := self selectedMember contents ]
  		on: CRCError
  		do: [ :ex | errorMessage := String streamContents: [ :stream |
  			stream nextPutAll: '********** WARNING!! Member is corrupt!! [ ';
  			nextPutAll: (ex messageText copyUpToLast: $( );
  			nextPutAll: '] **********'; cr ].
  			ex proceed ].
  
  	^self selectedMember isCorrupt
  		ifFalse: [ contents ]
  		ifTrue: [ errorMessage, contents ]!

Item was changed:
+ ----- Method: ArchiveViewer>>contents: (in category 'accessing') -----
- ----- Method: ArchiveViewer>>contents: (in category 'initialization') -----
  contents: aText
  	self shouldNotImplement.!

Item was changed:
+ ----- Method: ArchiveViewer>>createButtonBar (in category 'old morphic ui') -----
- ----- Method: ArchiveViewer>>createButtonBar (in category 'initialization') -----
  createButtonBar
  	| bar narrowFont registeredFonts |
  	registeredFonts := OrderedCollection new.
  	TextStyle knownTextStylesWithoutDefault do:
  		[:st | (TextStyle named: st) fonts do: [:f | registeredFonts addLast: f]].		
  	narrowFont := registeredFonts detectMin:
  			[:ea | ea widthOfString: 'Contents' from: 1 to: 8].
  	bar := AlignmentMorph newRow.
  	bar
  		color: self defaultBackgroundColor;
  		rubberBandCells: false;
  		vResizing: #shrinkWrap;
  		cellInset: 6 @ 0.
  	#(#('New\Archive' #canCreateNewArchive #createNewArchive 'Create a new, empty archive and discard this one') #('Load\Archive' #canOpenNewArchive #openNewArchive 'Open another archive and discard this one') #('Save\Archive As' #canSaveArchive #saveArchive 'Save this archive under a new name') #('Extract\All' #canExtractAll #extractAll 'Extract all this archive''s members into a directory') #('Add\File' #canAddMember #addMember 'Add a file to this archive') #('Add from\Clipboard' #canAddMember #addMemberFromClipboard 'Add the contents of the clipboard as a new file') #('Add\Directory' #canAddMember #addDirectory 'Add the entire contents of a directory, with all of its subdirectories') #('Extract\Member As' #canExtractMember #extractMember 'Extract the selected member to a file') #('Delete\Member' #canDeleteMember #deleteMember 'Remove the selected member from this archive') #('Rename\Member' #canRenameMember #renameMember 'Rename the selected member') #('View All\Contents' #canViewAllContents #changeViewAllContents 'Toggle the view of all the selected member''s contents')) 
  		do: 
  			[:arr | 
  			| buttonLabel button |
  			buttonLabel := (TextMorph new)
  						string: arr first withCRs
  							fontName: narrowFont familyName
  							size: narrowFont pointSize
  							wrap: false;
  						hResizing: #shrinkWrap;
  						lock;
  						yourself.
  			(button := PluggableButtonMorph 
  						on: self
  						getState: arr second
  						action: arr third)
  				vResizing: #shrinkWrap;
  				hResizing: #spaceFill;
  				onColor: self buttonOnColor offColor: self buttonOffColor;
  				label: buttonLabel;
  				setBalloonText: arr fourth.
  			bar addMorphBack: button.
  			buttonLabel composeToBounds].
  	^bar!

Item was changed:
+ ----- Method: ArchiveViewer>>createListHeadingUsingFont: (in category 'old morphic ui') -----
- ----- Method: ArchiveViewer>>createListHeadingUsingFont: (in category 'initialization') -----
  createListHeadingUsingFont: font
  	| sm |
  	sm := StringMorph contents: ' order  uncomp   comp   CRC-32       date     time     file name'.
  	font ifNotNil: [ sm font: font ].
  	^(AlignmentMorph newColumn)
  		color: self defaultBackgroundColor;
  		addMorph: sm;
  		yourself.!

Item was changed:
+ ----- Method: ArchiveViewer>>createWindow (in category 'old morphic ui') -----
- ----- Method: ArchiveViewer>>createWindow (in category 'initialization') -----
  createWindow
  	| list heading font text buttonBar |
  
  	font := (TextStyle named: #DefaultFixedTextStyle)
  		ifNotNil: [ :ts | ts fontArray first].
  
  	buttonBar := self createButtonBar.
  	self addMorph: buttonBar
  		fullFrame: (LayoutFrame fractions: (0 at 0 corner: 1.0 at 0.0) offsets: (0 at 0 corner: 0 at 44)).
  
  	self minimumExtent: (buttonBar fullBounds width + 20) @ 230.
  	self extent: self minimumExtent.
  
  	heading := self createListHeadingUsingFont: font.
  	self addMorph: heading
  		fullFrame: (LayoutFrame fractions: (0 at 0 corner: 1.0 at 0.0) offsets: (0 at 44 corner: 0 at 60)).
  
  	(list := PluggableListMorph new)
  		on: self list: #memberList
  		selected: #memberIndex changeSelected: #memberIndex:
  		menu: #memberMenu:shifted: keystroke: nil.
  	list color: self defaultBackgroundColor.
  
  	font ifNotNil: [list font: font].
  	self addMorph: list
  		fullFrame: (LayoutFrame fractions: (0 at 0 corner: 1.0 at 0.8) offsets: (0 at 60 corner: 0 at 0)).
  
  	text := PluggableTextMorph on: self 
  			text: #contents accept: nil
  			readSelection: nil menu: nil.
  	self addMorph: text
  		frame: (0 at 0.8 corner: 1.0 at 1.0).
  	text lock.
  
  	self setLabel: 'Ned''s Zip Viewer'!

Item was changed:
+ ----- Method: ArchiveViewer>>fileName: (in category 'accessing') -----
- ----- Method: ArchiveViewer>>fileName: (in category 'initialization') -----
  fileName: aString
  	archive := ZipArchive new readFrom: aString.
+ 	self labelString: aString.
- 	self setLabel: aString.
  	self memberIndex:  0.
  	self changed: #memberList!

Item was added:
+ ----- Method: ArchiveViewer>>headerContents (in category 'private') -----
+ headerContents
+ 	^ ' order  uncomp   comp   CRC-32       date     time     file name'.!

Item was changed:
  ----- Method: ArchiveViewer>>initialize (in category 'initialization') -----
  initialize
  	super initialize.
+ 	self labelString: 'New archive'.
  	memberIndex := 0.
  	viewAllContents := false.
  !

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

Item was added:
+ ----- Method: ArchiveViewer>>labelString: (in category 'private') -----
+ labelString: aString
+ 	labelString := aString.!

Item was changed:
  ----- Method: ArchiveViewer>>openNewArchive (in category 'archive operations') -----
  openNewArchive
  	|  result |
+ 	"result := FileList2 modalFileSelector ."
+ 	result := FileChooser new open.
- 	result := FileList2 modalFileSelector .
  	result ifNil: [ ^self ].
  	self fileName: (result directory fullNameFor: result name).
  !



More information about the Squeak-dev mailing list