The Inbox: Tools-fbs.488.mcz

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

The Inbox: Tools-fbs.488.mcz

commits-2
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@0 corner: 1@0.1) -> [self buildButtonBar: builder].
+ (0@0.1 corner: 1@0.2) -> [self buildMemberTitle: builder].
+ (0@0.2 corner: 1@0.75) -> [self buildMemberViewer: builder].
+ (0@0.75 corner: 1@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@0 corner: 1.0@0.0) offsets: (0@0 corner: 0@44)).
 
  self minimumExtent: (buttonBar fullBounds width + 20) @ 230.
  self extent: self minimumExtent.
 
  heading := self createListHeadingUsingFont: font.
  self addMorph: heading
  fullFrame: (LayoutFrame fractions: (0@0 corner: 1.0@0.0) offsets: (0@44 corner: 0@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@0 corner: 1.0@0.8) offsets: (0@60 corner: 0@0)).
 
  text := PluggableTextMorph on: self
  text: #contents accept: nil
  readSelection: nil menu: nil.
  self addMorph: text
  frame: (0@0.8 corner: 1.0@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).
  !