The Trunk: ToolBuilder-Morphic-mt.270.mcz

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

The Trunk: ToolBuilder-Morphic-mt.270.mcz

commits-2
Marcel Taeumel uploaded a new version of ToolBuilder-Morphic to project The Trunk:
http://source.squeak.org/trunk/ToolBuilder-Morphic-mt.270.mcz

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

Name: ToolBuilder-Morphic-mt.270
Author: mt
Time: 11 January 2021, 5:36:43.295446 pm
UUID: 5171b75b-ee89-b14f-8ec9-a27cdfaa52bb
Ancestors: ToolBuilder-Morphic-mt.269

To pluggable dialogs, add an expand button if the model supports #preferredExtent. Also tweaks a list-chooser's initial extent show 5 to 15 items which each about 10 to 20 characters, depending on the list's content.

This commit addresses the concerns raised in ToolBuilder-Morphic-cbc.270 (inbox).
See http://forum.world.st/The-Inbox-ToolBuilder-Morphic-cbc-270-mcz-tp5126045.html

=============== Diff against ToolBuilder-Morphic-mt.269 ===============

Item was changed:
  ----- Method: ListChooser>>buildWith: (in category 'building') -----
  buildWith: builder
 
  | dialogSpec searchBarHeight listSpec fieldSpec |
 
+ searchBarHeight := self searchBarHeight.
- searchBarHeight := Preferences standardDefaultTextFont height * 1.75.
 
  dialogSpec := builder pluggableDialogSpec new
  model: self;
  title: #title;
  closeAction: #closed;
  extent: self initialExtent;
  autoCancel: true; "Behave like a pop-up menu. Historical reasons."
  children: OrderedCollection new;
  buttons: OrderedCollection new;
  yourself.
 
  listSpec := builder pluggableListSpec new.
  listSpec
  model: self;
  list: #items;
  getIndex: #selectedIndex;
  setIndex: #selectedIndex:;
  doubleClick: #accept;
  "keystrokePreview: #keyStrokeFromList:;"
  autoDeselect: false;
  filterableList: true;
  clearFilterAutomatically: false;
  name: #list;
  frame: (LayoutFrame fractions: (0@0 corner: 1@1) offsets: (0@searchBarHeight corner: 0@0)).
  dialogSpec children add: listSpec.
 
  fieldSpec := builder pluggableInputFieldSpec new.
  fieldSpec
  model: self;
  name: #searchText ;
  getText: #searchText;
  editText: #searchText:;
  setText: #acceptText:;
  selection: #textSelection;
  menu: nil;
  indicateUnacceptedChanges: false;
  askBeforeDiscardingEdits: false;
  help: (self addAllowed ifTrue: ['Type new or filter existing...' translated] ifFalse: ['Type to filter existing...' translated]);
  frame: (LayoutFrame fractions: (0@0 corner: 1@0) offsets: (0@0 corner: 0@searchBarHeight)).
  dialogSpec children add: fieldSpec.
 
  "Buttons"
  dialogSpec buttons add: (
  builder pluggableButtonSpec new
  model: self;
  label: #acceptLabel;
  action: #accept;
  enabled: #canAcceptOrAdd;
  color: #acceptColor).
 
  dialogSpec buttons add: (
  builder pluggableButtonSpec new
  model: self;
  label: 'Cancel';
  action: #cancel;
  color: #cancelColor).
 
  dialogMorph := builder build: dialogSpec.
  dialogMorph addKeyboardCaptureFilter: self ; positionOverWidgetNamed: #searchText.
  listMorph := builder widgetAt: #list.
  listMorph allowEmptyFilterResult: true.
 
  ^ dialogMorph!

Item was changed:
  ----- Method: ListChooser>>initialExtent (in category 'building') -----
  initialExtent
 
+ | listFont itemCount maxItemSize cellSize |
- | listFont |
  listFont := Preferences standardListFont.
+ itemCount := items size.
+ maxItemSize := items inject: 0 into: [:max :item | max max: item size].
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10)
+ @ (itemCount + 1 "breathing space" min: 15 max: 5)
+ * cellSize) + (0@ self searchBarHeight)!
- ^ (20 * (listFont widthOf: $m))@(15 * listFont height)!

Item was added:
+ ----- Method: ListChooser>>preferredExtent (in category 'building') -----
+ preferredExtent
+
+ | listFont cellSize |
+ listFont := Preferences standardListFont.
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^  ((items inject: 0 into: [:max :item | max max: (listFont widthOfString: item)])
+ @ (items size * listFont height))
+ + ((1@1) * cellSize) "breathing space"
+ + (0@ self searchBarHeight)!

Item was added:
+ ----- Method: ListChooser>>searchBarHeight (in category 'building') -----
+ searchBarHeight
+
+ ^ Preferences standardDefaultTextFont height * 1.75!

Item was changed:
  ----- Method: ListMultipleChooser>>initialExtent (in category 'toolbuilder') -----
  initialExtent
 
+ | listFont itemCount maxItemSize cellSize |
- | listFont |
  listFont := Preferences standardListFont.
+ itemCount := labels size.
+ maxItemSize := labels inject: 0 into: [:max :item | max max: item size].
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10)
+ @ (itemCount + 1 "breathing space" min: 15 max: 5)
+ * cellSize)!
- ^ (20 * (listFont widthOf: $m))@(15 * listFont height)!

Item was added:
+ ----- Method: ListMultipleChooser>>preferredExtent (in category 'toolbuilder') -----
+ preferredExtent
+
+ | listFont cellSize |
+ listFont := Preferences standardListFont.
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^  ((labels inject: 0 into: [:max :item | max max: (listFont widthOfString: item)])
+ @ (labels size * listFont height))
+ + ((1@1) * cellSize) "breathing space"!

Item was changed:
  ----- Method: MorphicToolBuilder>>buildPluggableDialog: (in category 'widgets optional') -----
  buildPluggableDialog: aSpec
 
  | widget |
 
  widget := self dialogClass new.
  self register: widget id: aSpec name.
 
  widget model: aSpec model.
 
  "Set child dependent layout properties. The pane morph holds the special contents."
  widget paneMorph wantsPaneSplitters: (aSpec wantsResizeHandles ifNil: [true]).
  self setLayoutHintsFor: widget paneMorph spec: aSpec.
  widget paneMorph layoutInset: (aSpec padding ifNil: [ProportionalSplitterMorph gripThickness]).
  widget paneMorph cellGap: (aSpec spacing ifNil: [ProportionalSplitterMorph gripThickness]).
  widget paneMorph wantsPaneSplitters ifTrue: [
  widget paneMorph addCornerGrips"addEdgeGrips".
  widget paneMorph grips do: [:ea | ea showHandle: true]].
 
  "Now create the children."
  panes := OrderedCollection new.
  aSpec children isSymbol
  ifTrue: [
  widget getChildrenSelector: aSpec children.
  widget update: aSpec children]
  ifFalse: [
  self buildAll: aSpec children in: widget paneMorph].
 
  "Now create the buttons."
  aSpec buttons isSymbol
  ifTrue: [
  widget getButtonsSelector: aSpec buttons.
  widget update: aSpec buttons]
  ifFalse: [
  self buildAll: aSpec buttons in: widget buttonRowMorph.
  widget updateButtonProperties].
 
  aSpec title ifNotNil: [:label |
  label isSymbol
  ifTrue:[widget getTitleSelector: label; update: label]
  ifFalse:[widget title: label]].
  aSpec message ifNotNil: [:label |
  label isSymbol
  ifTrue:[widget getMessageSelector: label; update: label]
  ifFalse:[widget message: label]].
 
  "Interaction behavior."
  aSpec autoCancel ifNotNil: [:b | widget autoCancel: b].
  aSpec exclusive ifNotNil: [:b | widget exclusive: b].
 
  widget closeDialogSelector: aSpec closeAction.
  self buildHelpFor: widget spec: aSpec.
 
  "Everything is shrink-wrapped around the pane morph."
+ widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent])
+ + (widget paneMorph layoutInset * 2) asPoint.
- widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent]).
 
  ^ widget!

Item was added:
+ ----- Method: PluggableDialogWindow>>createTitle: (in category 'initialization') -----
+ createTitle: aString
+ "Overridden to add an extra expand button. Yet, it depends on the model's interface whether that button will be visible. See #model:."
+
+ | box expandButton|
+ super createTitle: aString.
+
+ expandButton := SystemWindowButton new
+ name: #expandButton;
+ color: Color transparent;
+ target: self;
+ actionSelector: #expandDialogPane;
+ balloonText: 'Expand this dialog' translated;
+ borderWidth: 0;
+ yourself.
+ SystemWindow expandBoxImage scaleIconToDisplay in: [:icon |
+ expandButton labelGraphic: icon; extent: icon extent].
+
+ box := self submorphNamed: #title.
+ box addMorphBack: expandButton.!

Item was added:
+ ----- Method: PluggableDialogWindow>>expandDialogPane (in category 'running') -----
+ expandDialogPane
+ "Expand the dialog pane to its preferred extent. Honor the visible area in the world."
+
+ | visibleArea decorationOffset expandedExtent |
+ visibleArea := self currentWorld visibleClearArea.
+ decorationOffset := self extent - self paneMorph extent.
+ expandedExtent := self model preferredExtent + (self paneMorph layoutInset * 2) asPoint.
+
+ self paneMorph extent: (expandedExtent min: visibleArea extent - decorationOffset).
+
+ self fullBounds.
+ self moveToPreferredPosition.!

Item was changed:
  ----- Method: PluggableDialogWindow>>model: (in category 'accessing') -----
+ model: newModel
- model: anObject
 
  model ifNotNil: [model removeDependent: self].
+ newModel ifNotNil: [
+ newModel addDependent: self.
+ (newModel respondsTo: #preferredExtent)
+ ifFalse: [((self submorphNamed: #title) submorphNamed: #expandButton) delete]].
+ model := newModel.!
- anObject ifNotNil: [anObject addDependent: self].
- model := anObject.!


Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: ToolBuilder-Morphic-mt.270.mcz

marcel.taeumel

Am 11.01.2021 17:36:52 schrieb [hidden email] <[hidden email]>:

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

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

Name: ToolBuilder-Morphic-mt.270
Author: mt
Time: 11 January 2021, 5:36:43.295446 pm
UUID: 5171b75b-ee89-b14f-8ec9-a27cdfaa52bb
Ancestors: ToolBuilder-Morphic-mt.269

To pluggable dialogs, add an expand button if the model supports #preferredExtent. Also tweaks a list-chooser's initial extent show 5 to 15 items which each about 10 to 20 characters, depending on the list's content.

This commit addresses the concerns raised in ToolBuilder-Morphic-cbc.270 (inbox).
See http://forum.world.st/The-Inbox-ToolBuilder-Morphic-cbc-270-mcz-tp5126045.html

=============== Diff against ToolBuilder-Morphic-mt.269 ===============

Item was changed:
----- Method: ListChooser>>buildWith: (in category 'building') -----
buildWith: builder

| dialogSpec searchBarHeight listSpec fieldSpec |

+ searchBarHeight := self searchBarHeight.
- searchBarHeight := Preferences standardDefaultTextFont height * 1.75.

dialogSpec := builder pluggableDialogSpec new
model: self;
title: #title;
closeAction: #closed;
extent: self initialExtent;
autoCancel: true; "Behave like a pop-up menu. Historical reasons."
children: OrderedCollection new;
buttons: OrderedCollection new;
yourself.

listSpec := builder pluggableListSpec new.
listSpec
model: self;
list: #items;
getIndex: #selectedIndex;
setIndex: #selectedIndex:;
doubleClick: #accept;
"keystrokePreview: #keyStrokeFromList:;"
autoDeselect: false;
filterableList: true;
clearFilterAutomatically: false;
name: #list;
frame: (LayoutFrame fractions: (0@0 corner: 1@1) offsets: (0@searchBarHeight corner: 0@0)).
dialogSpec children add: listSpec.

fieldSpec := builder pluggableInputFieldSpec new.
fieldSpec
model: self;
name: #searchText ;
getText: #searchText;
editText: #searchText:;
setText: #acceptText:;
selection: #textSelection;
menu: nil;
indicateUnacceptedChanges: false;
askBeforeDiscardingEdits: false;
help: (self addAllowed ifTrue: ['Type new or filter existing...' translated] ifFalse: ['Type to filter existing...' translated]);
frame: (LayoutFrame fractions: (0@0 corner: 1@0) offsets: (0@0 corner: 0@searchBarHeight)).
dialogSpec children add: fieldSpec.

"Buttons"
dialogSpec buttons add: (
builder pluggableButtonSpec new
model: self;
label: #acceptLabel;
action: #accept;
enabled: #canAcceptOrAdd;
color: #acceptColor).

dialogSpec buttons add: (
builder pluggableButtonSpec new
model: self;
label: 'Cancel';
action: #cancel;
color: #cancelColor).

dialogMorph := builder build: dialogSpec.
dialogMorph addKeyboardCaptureFilter: self ; positionOverWidgetNamed: #searchText.
listMorph := builder widgetAt: #list.
listMorph allowEmptyFilterResult: true.

^ dialogMorph!

Item was changed:
----- Method: ListChooser>>initialExtent (in category 'building') -----
initialExtent

+ | listFont itemCount maxItemSize cellSize |
- | listFont |
listFont := Preferences standardListFont.
+ itemCount := items size.
+ maxItemSize := items inject: 0 into: [:max :item | max max: item size].
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10)
+ @ (itemCount + 1 "breathing space" min: 15 max: 5)
+ * cellSize) + (0@ self searchBarHeight)!
- ^ (20 * (listFont widthOf: $m))@(15 * listFont height)!

Item was added:
+ ----- Method: ListChooser>>preferredExtent (in category 'building') -----
+ preferredExtent
+
+ | listFont cellSize |
+ listFont := Preferences standardListFont.
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((items inject: 0 into: [:max :item | max max: (listFont widthOfString: item)])
+ @ (items size * listFont height))
+ + ((1@1) * cellSize) "breathing space"
+ + (0@ self searchBarHeight)!

Item was added:
+ ----- Method: ListChooser>>searchBarHeight (in category 'building') -----
+ searchBarHeight
+
+ ^ Preferences standardDefaultTextFont height * 1.75!

Item was changed:
----- Method: ListMultipleChooser>>initialExtent (in category 'toolbuilder') -----
initialExtent

+ | listFont itemCount maxItemSize cellSize |
- | listFont |
listFont := Preferences standardListFont.
+ itemCount := labels size.
+ maxItemSize := labels inject: 0 into: [:max :item | max max: item size].
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10)
+ @ (itemCount + 1 "breathing space" min: 15 max: 5)
+ * cellSize)!
- ^ (20 * (listFont widthOf: $m))@(15 * listFont height)!

Item was added:
+ ----- Method: ListMultipleChooser>>preferredExtent (in category 'toolbuilder') -----
+ preferredExtent
+
+ | listFont cellSize |
+ listFont := Preferences standardListFont.
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((labels inject: 0 into: [:max :item | max max: (listFont widthOfString: item)])
+ @ (labels size * listFont height))
+ + ((1@1) * cellSize) "breathing space"!

Item was changed:
----- Method: MorphicToolBuilder>>buildPluggableDialog: (in category 'widgets optional') -----
buildPluggableDialog: aSpec

| widget |

widget := self dialogClass new.
self register: widget id: aSpec name.

widget model: aSpec model.

"Set child dependent layout properties. The pane morph holds the special contents."
widget paneMorph wantsPaneSplitters: (aSpec wantsResizeHandles ifNil: [true]).
self setLayoutHintsFor: widget paneMorph spec: aSpec.
widget paneMorph layoutInset: (aSpec padding ifNil: [ProportionalSplitterMorph gripThickness]).
widget paneMorph cellGap: (aSpec spacing ifNil: [ProportionalSplitterMorph gripThickness]).
widget paneMorph wantsPaneSplitters ifTrue: [
widget paneMorph addCornerGrips"addEdgeGrips".
widget paneMorph grips do: [:ea | ea showHandle: true]].

"Now create the children."
panes := OrderedCollection new.
aSpec children isSymbol
ifTrue: [
widget getChildrenSelector: aSpec children.
widget update: aSpec children]
ifFalse: [
self buildAll: aSpec children in: widget paneMorph].

"Now create the buttons."
aSpec buttons isSymbol
ifTrue: [
widget getButtonsSelector: aSpec buttons.
widget update: aSpec buttons]
ifFalse: [
self buildAll: aSpec buttons in: widget buttonRowMorph.
widget updateButtonProperties].

aSpec title ifNotNil: [:label |
label isSymbol
ifTrue:[widget getTitleSelector: label; update: label]
ifFalse:[widget title: label]].
aSpec message ifNotNil: [:label |
label isSymbol
ifTrue:[widget getMessageSelector: label; update: label]
ifFalse:[widget message: label]].

"Interaction behavior."
aSpec autoCancel ifNotNil: [:b | widget autoCancel: b].
aSpec exclusive ifNotNil: [:b | widget exclusive: b].

widget closeDialogSelector: aSpec closeAction.
self buildHelpFor: widget spec: aSpec.

"Everything is shrink-wrapped around the pane morph."
+ widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent])
+ + (widget paneMorph layoutInset * 2) asPoint.
- widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent]).

^ widget!

Item was added:
+ ----- Method: PluggableDialogWindow>>createTitle: (in category 'initialization') -----
+ createTitle: aString
+ "Overridden to add an extra expand button. Yet, it depends on the model's interface whether that button will be visible. See #model:."
+
+ | box expandButton|
+ super createTitle: aString.
+
+ expandButton := SystemWindowButton new
+ name: #expandButton;
+ color: Color transparent;
+ target: self;
+ actionSelector: #expandDialogPane;
+ balloonText: 'Expand this dialog' translated;
+ borderWidth: 0;
+ yourself.
+ SystemWindow expandBoxImage scaleIconToDisplay in: [:icon |
+ expandButton labelGraphic: icon; extent: icon extent].
+
+ box := self submorphNamed: #title.
+ box addMorphBack: expandButton.!

Item was added:
+ ----- Method: PluggableDialogWindow>>expandDialogPane (in category 'running') -----
+ expandDialogPane
+ "Expand the dialog pane to its preferred extent. Honor the visible area in the world."
+
+ | visibleArea decorationOffset expandedExtent |
+ visibleArea := self currentWorld visibleClearArea.
+ decorationOffset := self extent - self paneMorph extent.
+ expandedExtent := self model preferredExtent + (self paneMorph layoutInset * 2) asPoint.
+
+ self paneMorph extent: (expandedExtent min: visibleArea extent - decorationOffset).
+
+ self fullBounds.
+ self moveToPreferredPosition.!

Item was changed:
----- Method: PluggableDialogWindow>>model: (in category 'accessing') -----
+ model: newModel
- model: anObject

model ifNotNil: [model removeDependent: self].
+ newModel ifNotNil: [
+ newModel addDependent: self.
+ (newModel respondsTo: #preferredExtent)
+ ifFalse: [((self submorphNamed: #title) submorphNamed: #expandButton) delete]].
+ model := newModel.!
- anObject ifNotNil: [anObject addDependent: self].
- model := anObject.!




cbc
Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: ToolBuilder-Morphic-mt.270.mcz

cbc
  Close.  I'd still like to try and make it wide for the strings provided.  Note that :
 width := ((items take: 15) collect: [:item| listFont widthOfString: item]) max. "A good estimate of what is needed in the list box width"
works for both string and Text.  That said, we should still have 2 bounds - one for width of world (dialog will build bigger than the world - not good) and lower bound for the size of the buttons - it would be nice not to stack the Choose/Cancel button.

For the height - what you have is better than what I had - that part I like.

On Mon, Jan 11, 2021 at 8:38 AM Marcel Taeumel <[hidden email]> wrote:

Am 11.01.2021 17:36:52 schrieb [hidden email] <[hidden email]>:

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

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

Name: ToolBuilder-Morphic-mt.270
Author: mt
Time: 11 January 2021, 5:36:43.295446 pm
UUID: 5171b75b-ee89-b14f-8ec9-a27cdfaa52bb
Ancestors: ToolBuilder-Morphic-mt.269

To pluggable dialogs, add an expand button if the model supports #preferredExtent. Also tweaks a list-chooser's initial extent show 5 to 15 items which each about 10 to 20 characters, depending on the list's content.

This commit addresses the concerns raised in ToolBuilder-Morphic-cbc.270 (inbox).
See http://forum.world.st/The-Inbox-ToolBuilder-Morphic-cbc-270-mcz-tp5126045.html

=============== Diff against ToolBuilder-Morphic-mt.269 ===============

Item was changed:
----- Method: ListChooser>>buildWith: (in category 'building') -----
buildWith: builder

| dialogSpec searchBarHeight listSpec fieldSpec |

+ searchBarHeight := self searchBarHeight.
- searchBarHeight := Preferences standardDefaultTextFont height * 1.75.

dialogSpec := builder pluggableDialogSpec new
model: self;
title: #title;
closeAction: #closed;
extent: self initialExtent;
autoCancel: true; "Behave like a pop-up menu. Historical reasons."
children: OrderedCollection new;
buttons: OrderedCollection new;
yourself.

listSpec := builder pluggableListSpec new.
listSpec
model: self;
list: #items;
getIndex: #selectedIndex;
setIndex: #selectedIndex:;
doubleClick: #accept;
"keystrokePreview: #keyStrokeFromList:;"
autoDeselect: false;
filterableList: true;
clearFilterAutomatically: false;
name: #list;
frame: (LayoutFrame fractions: (0@0 corner: 1@1) offsets: (0@searchBarHeight corner: 0@0)).
dialogSpec children add: listSpec.

fieldSpec := builder pluggableInputFieldSpec new.
fieldSpec
model: self;
name: #searchText ;
getText: #searchText;
editText: #searchText:;
setText: #acceptText:;
selection: #textSelection;
menu: nil;
indicateUnacceptedChanges: false;
askBeforeDiscardingEdits: false;
help: (self addAllowed ifTrue: ['Type new or filter existing...' translated] ifFalse: ['Type to filter existing...' translated]);
frame: (LayoutFrame fractions: (0@0 corner: 1@0) offsets: (0@0 corner: 0@searchBarHeight)).
dialogSpec children add: fieldSpec.

"Buttons"
dialogSpec buttons add: (
builder pluggableButtonSpec new
model: self;
label: #acceptLabel;
action: #accept;
enabled: #canAcceptOrAdd;
color: #acceptColor).

dialogSpec buttons add: (
builder pluggableButtonSpec new
model: self;
label: 'Cancel';
action: #cancel;
color: #cancelColor).

dialogMorph := builder build: dialogSpec.
dialogMorph addKeyboardCaptureFilter: self ; positionOverWidgetNamed: #searchText.
listMorph := builder widgetAt: #list.
listMorph allowEmptyFilterResult: true.

^ dialogMorph!

Item was changed:
----- Method: ListChooser>>initialExtent (in category 'building') -----
initialExtent

+ | listFont itemCount maxItemSize cellSize |
- | listFont |
listFont := Preferences standardListFont.
+ itemCount := items size.
+ maxItemSize := items inject: 0 into: [:max :item | max max: item size].
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10)
+ @ (itemCount + 1 "breathing space" min: 15 max: 5)
+ * cellSize) + (0@ self searchBarHeight)!
- ^ (20 * (listFont widthOf: $m))@(15 * listFont height)!

Item was added:
+ ----- Method: ListChooser>>preferredExtent (in category 'building') -----
+ preferredExtent
+
+ | listFont cellSize |
+ listFont := Preferences standardListFont.
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((items inject: 0 into: [:max :item | max max: (listFont widthOfString: item)])
+ @ (items size * listFont height))
+ + ((1@1) * cellSize) "breathing space"
+ + (0@ self searchBarHeight)!

Item was added:
+ ----- Method: ListChooser>>searchBarHeight (in category 'building') -----
+ searchBarHeight
+
+ ^ Preferences standardDefaultTextFont height * 1.75!

Item was changed:
----- Method: ListMultipleChooser>>initialExtent (in category 'toolbuilder') -----
initialExtent

+ | listFont itemCount maxItemSize cellSize |
- | listFont |
listFont := Preferences standardListFont.
+ itemCount := labels size.
+ maxItemSize := labels inject: 0 into: [:max :item | max max: item size].
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10)
+ @ (itemCount + 1 "breathing space" min: 15 max: 5)
+ * cellSize)!
- ^ (20 * (listFont widthOf: $m))@(15 * listFont height)!

Item was added:
+ ----- Method: ListMultipleChooser>>preferredExtent (in category 'toolbuilder') -----
+ preferredExtent
+
+ | listFont cellSize |
+ listFont := Preferences standardListFont.
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((labels inject: 0 into: [:max :item | max max: (listFont widthOfString: item)])
+ @ (labels size * listFont height))
+ + ((1@1) * cellSize) "breathing space"!

Item was changed:
----- Method: MorphicToolBuilder>>buildPluggableDialog: (in category 'widgets optional') -----
buildPluggableDialog: aSpec

| widget |

widget := self dialogClass new.
self register: widget id: aSpec name.

widget model: aSpec model.

"Set child dependent layout properties. The pane morph holds the special contents."
widget paneMorph wantsPaneSplitters: (aSpec wantsResizeHandles ifNil: [true]).
self setLayoutHintsFor: widget paneMorph spec: aSpec.
widget paneMorph layoutInset: (aSpec padding ifNil: [ProportionalSplitterMorph gripThickness]).
widget paneMorph cellGap: (aSpec spacing ifNil: [ProportionalSplitterMorph gripThickness]).
widget paneMorph wantsPaneSplitters ifTrue: [
widget paneMorph addCornerGrips"addEdgeGrips".
widget paneMorph grips do: [:ea | ea showHandle: true]].

"Now create the children."
panes := OrderedCollection new.
aSpec children isSymbol
ifTrue: [
widget getChildrenSelector: aSpec children.
widget update: aSpec children]
ifFalse: [
self buildAll: aSpec children in: widget paneMorph].

"Now create the buttons."
aSpec buttons isSymbol
ifTrue: [
widget getButtonsSelector: aSpec buttons.
widget update: aSpec buttons]
ifFalse: [
self buildAll: aSpec buttons in: widget buttonRowMorph.
widget updateButtonProperties].

aSpec title ifNotNil: [:label |
label isSymbol
ifTrue:[widget getTitleSelector: label; update: label]
ifFalse:[widget title: label]].
aSpec message ifNotNil: [:label |
label isSymbol
ifTrue:[widget getMessageSelector: label; update: label]
ifFalse:[widget message: label]].

"Interaction behavior."
aSpec autoCancel ifNotNil: [:b | widget autoCancel: b].
aSpec exclusive ifNotNil: [:b | widget exclusive: b].

widget closeDialogSelector: aSpec closeAction.
self buildHelpFor: widget spec: aSpec.

"Everything is shrink-wrapped around the pane morph."
+ widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent])
+ + (widget paneMorph layoutInset * 2) asPoint.
- widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent]).

^ widget!

Item was added:
+ ----- Method: PluggableDialogWindow>>createTitle: (in category 'initialization') -----
+ createTitle: aString
+ "Overridden to add an extra expand button. Yet, it depends on the model's interface whether that button will be visible. See #model:."
+
+ | box expandButton|
+ super createTitle: aString.
+
+ expandButton := SystemWindowButton new
+ name: #expandButton;
+ color: Color transparent;
+ target: self;
+ actionSelector: #expandDialogPane;
+ balloonText: 'Expand this dialog' translated;
+ borderWidth: 0;
+ yourself.
+ SystemWindow expandBoxImage scaleIconToDisplay in: [:icon |
+ expandButton labelGraphic: icon; extent: icon extent].
+
+ box := self submorphNamed: #title.
+ box addMorphBack: expandButton.!

Item was added:
+ ----- Method: PluggableDialogWindow>>expandDialogPane (in category 'running') -----
+ expandDialogPane
+ "Expand the dialog pane to its preferred extent. Honor the visible area in the world."
+
+ | visibleArea decorationOffset expandedExtent |
+ visibleArea := self currentWorld visibleClearArea.
+ decorationOffset := self extent - self paneMorph extent.
+ expandedExtent := self model preferredExtent + (self paneMorph layoutInset * 2) asPoint.
+
+ self paneMorph extent: (expandedExtent min: visibleArea extent - decorationOffset).
+
+ self fullBounds.
+ self moveToPreferredPosition.!

Item was changed:
----- Method: PluggableDialogWindow>>model: (in category 'accessing') -----
+ model: newModel
- model: anObject

model ifNotNil: [model removeDependent: self].
+ newModel ifNotNil: [
+ newModel addDependent: self.
+ (newModel respondsTo: #preferredExtent)
+ ifFalse: [((self submorphNamed: #title) submorphNamed: #expandButton) delete]].
+ model := newModel.!
- anObject ifNotNil: [anObject addDependent: self].
- model := anObject.!





cbc
Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: ToolBuilder-Morphic-mt.270.mcz

cbc
Would my current version 271 in the inbox be acceptable?

-cbc

On Mon, Jan 11, 2021 at 9:48 AM Chris Cunningham <[hidden email]> wrote:
  Close.  I'd still like to try and make it wide for the strings provided.  Note that :
 width := ((items take: 15) collect: [:item| listFont widthOfString: item]) max. "A good estimate of what is needed in the list box width"
works for both string and Text.  That said, we should still have 2 bounds - one for width of world (dialog will build bigger than the world - not good) and lower bound for the size of the buttons - it would be nice not to stack the Choose/Cancel button.

For the height - what you have is better than what I had - that part I like.

On Mon, Jan 11, 2021 at 8:38 AM Marcel Taeumel <[hidden email]> wrote:

Am 11.01.2021 17:36:52 schrieb [hidden email] <[hidden email]>:

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

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

Name: ToolBuilder-Morphic-mt.270
Author: mt
Time: 11 January 2021, 5:36:43.295446 pm
UUID: 5171b75b-ee89-b14f-8ec9-a27cdfaa52bb
Ancestors: ToolBuilder-Morphic-mt.269

To pluggable dialogs, add an expand button if the model supports #preferredExtent. Also tweaks a list-chooser's initial extent show 5 to 15 items which each about 10 to 20 characters, depending on the list's content.

This commit addresses the concerns raised in ToolBuilder-Morphic-cbc.270 (inbox).
See http://forum.world.st/The-Inbox-ToolBuilder-Morphic-cbc-270-mcz-tp5126045.html

=============== Diff against ToolBuilder-Morphic-mt.269 ===============

Item was changed:
----- Method: ListChooser>>buildWith: (in category 'building') -----
buildWith: builder

| dialogSpec searchBarHeight listSpec fieldSpec |

+ searchBarHeight := self searchBarHeight.
- searchBarHeight := Preferences standardDefaultTextFont height * 1.75.

dialogSpec := builder pluggableDialogSpec new
model: self;
title: #title;
closeAction: #closed;
extent: self initialExtent;
autoCancel: true; "Behave like a pop-up menu. Historical reasons."
children: OrderedCollection new;
buttons: OrderedCollection new;
yourself.

listSpec := builder pluggableListSpec new.
listSpec
model: self;
list: #items;
getIndex: #selectedIndex;
setIndex: #selectedIndex:;
doubleClick: #accept;
"keystrokePreview: #keyStrokeFromList:;"
autoDeselect: false;
filterableList: true;
clearFilterAutomatically: false;
name: #list;
frame: (LayoutFrame fractions: (0@0 corner: 1@1) offsets: (0@searchBarHeight corner: 0@0)).
dialogSpec children add: listSpec.

fieldSpec := builder pluggableInputFieldSpec new.
fieldSpec
model: self;
name: #searchText ;
getText: #searchText;
editText: #searchText:;
setText: #acceptText:;
selection: #textSelection;
menu: nil;
indicateUnacceptedChanges: false;
askBeforeDiscardingEdits: false;
help: (self addAllowed ifTrue: ['Type new or filter existing...' translated] ifFalse: ['Type to filter existing...' translated]);
frame: (LayoutFrame fractions: (0@0 corner: 1@0) offsets: (0@0 corner: 0@searchBarHeight)).
dialogSpec children add: fieldSpec.

"Buttons"
dialogSpec buttons add: (
builder pluggableButtonSpec new
model: self;
label: #acceptLabel;
action: #accept;
enabled: #canAcceptOrAdd;
color: #acceptColor).

dialogSpec buttons add: (
builder pluggableButtonSpec new
model: self;
label: 'Cancel';
action: #cancel;
color: #cancelColor).

dialogMorph := builder build: dialogSpec.
dialogMorph addKeyboardCaptureFilter: self ; positionOverWidgetNamed: #searchText.
listMorph := builder widgetAt: #list.
listMorph allowEmptyFilterResult: true.

^ dialogMorph!

Item was changed:
----- Method: ListChooser>>initialExtent (in category 'building') -----
initialExtent

+ | listFont itemCount maxItemSize cellSize |
- | listFont |
listFont := Preferences standardListFont.
+ itemCount := items size.
+ maxItemSize := items inject: 0 into: [:max :item | max max: item size].
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10)
+ @ (itemCount + 1 "breathing space" min: 15 max: 5)
+ * cellSize) + (0@ self searchBarHeight)!
- ^ (20 * (listFont widthOf: $m))@(15 * listFont height)!

Item was added:
+ ----- Method: ListChooser>>preferredExtent (in category 'building') -----
+ preferredExtent
+
+ | listFont cellSize |
+ listFont := Preferences standardListFont.
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((items inject: 0 into: [:max :item | max max: (listFont widthOfString: item)])
+ @ (items size * listFont height))
+ + ((1@1) * cellSize) "breathing space"
+ + (0@ self searchBarHeight)!

Item was added:
+ ----- Method: ListChooser>>searchBarHeight (in category 'building') -----
+ searchBarHeight
+
+ ^ Preferences standardDefaultTextFont height * 1.75!

Item was changed:
----- Method: ListMultipleChooser>>initialExtent (in category 'toolbuilder') -----
initialExtent

+ | listFont itemCount maxItemSize cellSize |
- | listFont |
listFont := Preferences standardListFont.
+ itemCount := labels size.
+ maxItemSize := labels inject: 0 into: [:max :item | max max: item size].
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10)
+ @ (itemCount + 1 "breathing space" min: 15 max: 5)
+ * cellSize)!
- ^ (20 * (listFont widthOf: $m))@(15 * listFont height)!

Item was added:
+ ----- Method: ListMultipleChooser>>preferredExtent (in category 'toolbuilder') -----
+ preferredExtent
+
+ | listFont cellSize |
+ listFont := Preferences standardListFont.
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((labels inject: 0 into: [:max :item | max max: (listFont widthOfString: item)])
+ @ (labels size * listFont height))
+ + ((1@1) * cellSize) "breathing space"!

Item was changed:
----- Method: MorphicToolBuilder>>buildPluggableDialog: (in category 'widgets optional') -----
buildPluggableDialog: aSpec

| widget |

widget := self dialogClass new.
self register: widget id: aSpec name.

widget model: aSpec model.

"Set child dependent layout properties. The pane morph holds the special contents."
widget paneMorph wantsPaneSplitters: (aSpec wantsResizeHandles ifNil: [true]).
self setLayoutHintsFor: widget paneMorph spec: aSpec.
widget paneMorph layoutInset: (aSpec padding ifNil: [ProportionalSplitterMorph gripThickness]).
widget paneMorph cellGap: (aSpec spacing ifNil: [ProportionalSplitterMorph gripThickness]).
widget paneMorph wantsPaneSplitters ifTrue: [
widget paneMorph addCornerGrips"addEdgeGrips".
widget paneMorph grips do: [:ea | ea showHandle: true]].

"Now create the children."
panes := OrderedCollection new.
aSpec children isSymbol
ifTrue: [
widget getChildrenSelector: aSpec children.
widget update: aSpec children]
ifFalse: [
self buildAll: aSpec children in: widget paneMorph].

"Now create the buttons."
aSpec buttons isSymbol
ifTrue: [
widget getButtonsSelector: aSpec buttons.
widget update: aSpec buttons]
ifFalse: [
self buildAll: aSpec buttons in: widget buttonRowMorph.
widget updateButtonProperties].

aSpec title ifNotNil: [:label |
label isSymbol
ifTrue:[widget getTitleSelector: label; update: label]
ifFalse:[widget title: label]].
aSpec message ifNotNil: [:label |
label isSymbol
ifTrue:[widget getMessageSelector: label; update: label]
ifFalse:[widget message: label]].

"Interaction behavior."
aSpec autoCancel ifNotNil: [:b | widget autoCancel: b].
aSpec exclusive ifNotNil: [:b | widget exclusive: b].

widget closeDialogSelector: aSpec closeAction.
self buildHelpFor: widget spec: aSpec.

"Everything is shrink-wrapped around the pane morph."
+ widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent])
+ + (widget paneMorph layoutInset * 2) asPoint.
- widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent]).

^ widget!

Item was added:
+ ----- Method: PluggableDialogWindow>>createTitle: (in category 'initialization') -----
+ createTitle: aString
+ "Overridden to add an extra expand button. Yet, it depends on the model's interface whether that button will be visible. See #model:."
+
+ | box expandButton|
+ super createTitle: aString.
+
+ expandButton := SystemWindowButton new
+ name: #expandButton;
+ color: Color transparent;
+ target: self;
+ actionSelector: #expandDialogPane;
+ balloonText: 'Expand this dialog' translated;
+ borderWidth: 0;
+ yourself.
+ SystemWindow expandBoxImage scaleIconToDisplay in: [:icon |
+ expandButton labelGraphic: icon; extent: icon extent].
+
+ box := self submorphNamed: #title.
+ box addMorphBack: expandButton.!

Item was added:
+ ----- Method: PluggableDialogWindow>>expandDialogPane (in category 'running') -----
+ expandDialogPane
+ "Expand the dialog pane to its preferred extent. Honor the visible area in the world."
+
+ | visibleArea decorationOffset expandedExtent |
+ visibleArea := self currentWorld visibleClearArea.
+ decorationOffset := self extent - self paneMorph extent.
+ expandedExtent := self model preferredExtent + (self paneMorph layoutInset * 2) asPoint.
+
+ self paneMorph extent: (expandedExtent min: visibleArea extent - decorationOffset).
+
+ self fullBounds.
+ self moveToPreferredPosition.!

Item was changed:
----- Method: PluggableDialogWindow>>model: (in category 'accessing') -----
+ model: newModel
- model: anObject

model ifNotNil: [model removeDependent: self].
+ newModel ifNotNil: [
+ newModel addDependent: self.
+ (newModel respondsTo: #preferredExtent)
+ ifFalse: [((self submorphNamed: #title) submorphNamed: #expandButton) delete]].
+ model := newModel.!
- anObject ifNotNil: [anObject addDependent: self].
- model := anObject.!





Reply | Threaded
Open this post in threaded view
|

Re: The Trunk: ToolBuilder-Morphic-mt.270.mcz

marcel.taeumel
Hi Chris.

Would my current version 271 in the inbox be acceptable?

Not quite:
- If you want to make use of horizontal scroll bars in such lists, please disable the preference "Always hise h scroll bar"
- An initial world bounds check should be added to DialogWindow, not the dialog's model. I will do that. It is missing.
- That "defaultCellWidthIndex" and "listBoxBoundaryLineSize" do not belong into the model. Not sure what you want to achieve here. The use of "searchBarHeight" is a compromise due to #buildWidth:.

it would be nice not to stack the Choose/Cancel button.

Yeah, that's tricky. Buttons should not be stacked if there is enough width. There is an issue with HI-DPI usabge, though. But also we need a stacking logic for some ancient uses of list choose for yes/no/cancel.

That said, we should still have 2 bounds - one for width of world (dialog will build bigger than the world - not good) and lower bound for the size of the buttons.

Agreed for the world bounds, disagreed for the buttons. Sorry about that button wrapping. It's due to some ancient but expected uses of list-choosers for yes/no/cancel. Maybe I can find a better solution in the future to avoid unnecessary button wraps. :-/

Best,
Marcel

Am 11.01.2021 20:48:15 schrieb Chris Cunningham <[hidden email]>:

Would my current version 271 in the inbox be acceptable?

-cbc

On Mon, Jan 11, 2021 at 9:48 AM Chris Cunningham <[hidden email]> wrote:
  Close.  I'd still like to try and make it wide for the strings provided.  Note that :
 width := ((items take: 15) collect: [:item| listFont widthOfString: item]) max. "A good estimate of what is needed in the list box width"
works for both string and Text.  That said, we should still have 2 bounds - one for width of world (dialog will build bigger than the world - not good) and lower bound for the size of the buttons - it would be nice not to stack the Choose/Cancel button.

For the height - what you have is better than what I had - that part I like.

On Mon, Jan 11, 2021 at 8:38 AM Marcel Taeumel <[hidden email]> wrote:

Am 11.01.2021 17:36:52 schrieb [hidden email] <[hidden email]>:

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

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

Name: ToolBuilder-Morphic-mt.270
Author: mt
Time: 11 January 2021, 5:36:43.295446 pm
UUID: 5171b75b-ee89-b14f-8ec9-a27cdfaa52bb
Ancestors: ToolBuilder-Morphic-mt.269

To pluggable dialogs, add an expand button if the model supports #preferredExtent. Also tweaks a list-chooser's initial extent show 5 to 15 items which each about 10 to 20 characters, depending on the list's content.

This commit addresses the concerns raised in ToolBuilder-Morphic-cbc.270 (inbox).
See http://forum.world.st/The-Inbox-ToolBuilder-Morphic-cbc-270-mcz-tp5126045.html

=============== Diff against ToolBuilder-Morphic-mt.269 ===============

Item was changed:
----- Method: ListChooser>>buildWith: (in category 'building') -----
buildWith: builder

| dialogSpec searchBarHeight listSpec fieldSpec |

+ searchBarHeight := self searchBarHeight.
- searchBarHeight := Preferences standardDefaultTextFont height * 1.75.

dialogSpec := builder pluggableDialogSpec new
model: self;
title: #title;
closeAction: #closed;
extent: self initialExtent;
autoCancel: true; "Behave like a pop-up menu. Historical reasons."
children: OrderedCollection new;
buttons: OrderedCollection new;
yourself.

listSpec := builder pluggableListSpec new.
listSpec
model: self;
list: #items;
getIndex: #selectedIndex;
setIndex: #selectedIndex:;
doubleClick: #accept;
"keystrokePreview: #keyStrokeFromList:;"
autoDeselect: false;
filterableList: true;
clearFilterAutomatically: false;
name: #list;
frame: (LayoutFrame fractions: (0@0 corner: 1@1) offsets: (0@searchBarHeight corner: 0@0)).
dialogSpec children add: listSpec.

fieldSpec := builder pluggableInputFieldSpec new.
fieldSpec
model: self;
name: #searchText ;
getText: #searchText;
editText: #searchText:;
setText: #acceptText:;
selection: #textSelection;
menu: nil;
indicateUnacceptedChanges: false;
askBeforeDiscardingEdits: false;
help: (self addAllowed ifTrue: ['Type new or filter existing...' translated] ifFalse: ['Type to filter existing...' translated]);
frame: (LayoutFrame fractions: (0@0 corner: 1@0) offsets: (0@0 corner: 0@searchBarHeight)).
dialogSpec children add: fieldSpec.

"Buttons"
dialogSpec buttons add: (
builder pluggableButtonSpec new
model: self;
label: #acceptLabel;
action: #accept;
enabled: #canAcceptOrAdd;
color: #acceptColor).

dialogSpec buttons add: (
builder pluggableButtonSpec new
model: self;
label: 'Cancel';
action: #cancel;
color: #cancelColor).

dialogMorph := builder build: dialogSpec.
dialogMorph addKeyboardCaptureFilter: self ; positionOverWidgetNamed: #searchText.
listMorph := builder widgetAt: #list.
listMorph allowEmptyFilterResult: true.

^ dialogMorph!

Item was changed:
----- Method: ListChooser>>initialExtent (in category 'building') -----
initialExtent

+ | listFont itemCount maxItemSize cellSize |
- | listFont |
listFont := Preferences standardListFont.
+ itemCount := items size.
+ maxItemSize := items inject: 0 into: [:max :item | max max: item size].
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10)
+ @ (itemCount + 1 "breathing space" min: 15 max: 5)
+ * cellSize) + (0@ self searchBarHeight)!
- ^ (20 * (listFont widthOf: $m))@(15 * listFont height)!

Item was added:
+ ----- Method: ListChooser>>preferredExtent (in category 'building') -----
+ preferredExtent
+
+ | listFont cellSize |
+ listFont := Preferences standardListFont.
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((items inject: 0 into: [:max :item | max max: (listFont widthOfString: item)])
+ @ (items size * listFont height))
+ + ((1@1) * cellSize) "breathing space"
+ + (0@ self searchBarHeight)!

Item was added:
+ ----- Method: ListChooser>>searchBarHeight (in category 'building') -----
+ searchBarHeight
+
+ ^ Preferences standardDefaultTextFont height * 1.75!

Item was changed:
----- Method: ListMultipleChooser>>initialExtent (in category 'toolbuilder') -----
initialExtent

+ | listFont itemCount maxItemSize cellSize |
- | listFont |
listFont := Preferences standardListFont.
+ itemCount := labels size.
+ maxItemSize := labels inject: 0 into: [:max :item | max max: item size].
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((maxItemSize + 1 "breathing space" min: 20 max: 10)
+ @ (itemCount + 1 "breathing space" min: 15 max: 5)
+ * cellSize)!
- ^ (20 * (listFont widthOf: $m))@(15 * listFont height)!

Item was added:
+ ----- Method: ListMultipleChooser>>preferredExtent (in category 'toolbuilder') -----
+ preferredExtent
+
+ | listFont cellSize |
+ listFont := Preferences standardListFont.
+ cellSize := (listFont widthOf: $m) @ listFont height.
+
+ ^ ((labels inject: 0 into: [:max :item | max max: (listFont widthOfString: item)])
+ @ (labels size * listFont height))
+ + ((1@1) * cellSize) "breathing space"!

Item was changed:
----- Method: MorphicToolBuilder>>buildPluggableDialog: (in category 'widgets optional') -----
buildPluggableDialog: aSpec

| widget |

widget := self dialogClass new.
self register: widget id: aSpec name.

widget model: aSpec model.

"Set child dependent layout properties. The pane morph holds the special contents."
widget paneMorph wantsPaneSplitters: (aSpec wantsResizeHandles ifNil: [true]).
self setLayoutHintsFor: widget paneMorph spec: aSpec.
widget paneMorph layoutInset: (aSpec padding ifNil: [ProportionalSplitterMorph gripThickness]).
widget paneMorph cellGap: (aSpec spacing ifNil: [ProportionalSplitterMorph gripThickness]).
widget paneMorph wantsPaneSplitters ifTrue: [
widget paneMorph addCornerGrips"addEdgeGrips".
widget paneMorph grips do: [:ea | ea showHandle: true]].

"Now create the children."
panes := OrderedCollection new.
aSpec children isSymbol
ifTrue: [
widget getChildrenSelector: aSpec children.
widget update: aSpec children]
ifFalse: [
self buildAll: aSpec children in: widget paneMorph].

"Now create the buttons."
aSpec buttons isSymbol
ifTrue: [
widget getButtonsSelector: aSpec buttons.
widget update: aSpec buttons]
ifFalse: [
self buildAll: aSpec buttons in: widget buttonRowMorph.
widget updateButtonProperties].

aSpec title ifNotNil: [:label |
label isSymbol
ifTrue:[widget getTitleSelector: label; update: label]
ifFalse:[widget title: label]].
aSpec message ifNotNil: [:label |
label isSymbol
ifTrue:[widget getMessageSelector: label; update: label]
ifFalse:[widget message: label]].

"Interaction behavior."
aSpec autoCancel ifNotNil: [:b | widget autoCancel: b].
aSpec exclusive ifNotNil: [:b | widget exclusive: b].

widget closeDialogSelector: aSpec closeAction.
self buildHelpFor: widget spec: aSpec.

"Everything is shrink-wrapped around the pane morph."
+ widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent])
+ + (widget paneMorph layoutInset * 2) asPoint.
- widget paneMorph extent: (aSpec extent ifNil:[widget initialExtent]).

^ widget!

Item was added:
+ ----- Method: PluggableDialogWindow>>createTitle: (in category 'initialization') -----
+ createTitle: aString
+ "Overridden to add an extra expand button. Yet, it depends on the model's interface whether that button will be visible. See #model:."
+
+ | box expandButton|
+ super createTitle: aString.
+
+ expandButton := SystemWindowButton new
+ name: #expandButton;
+ color: Color transparent;
+ target: self;
+ actionSelector: #expandDialogPane;
+ balloonText: 'Expand this dialog' translated;
+ borderWidth: 0;
+ yourself.
+ SystemWindow expandBoxImage scaleIconToDisplay in: [:icon |
+ expandButton labelGraphic: icon; extent: icon extent].
+
+ box := self submorphNamed: #title.
+ box addMorphBack: expandButton.!

Item was added:
+ ----- Method: PluggableDialogWindow>>expandDialogPane (in category 'running') -----
+ expandDialogPane
+ "Expand the dialog pane to its preferred extent. Honor the visible area in the world."
+
+ | visibleArea decorationOffset expandedExtent |
+ visibleArea := self currentWorld visibleClearArea.
+ decorationOffset := self extent - self paneMorph extent.
+ expandedExtent := self model preferredExtent + (self paneMorph layoutInset * 2) asPoint.
+
+ self paneMorph extent: (expandedExtent min: visibleArea extent - decorationOffset).
+
+ self fullBounds.
+ self moveToPreferredPosition.!

Item was changed:
----- Method: PluggableDialogWindow>>model: (in category 'accessing') -----
+ model: newModel
- model: anObject

model ifNotNil: [model removeDependent: self].
+ newModel ifNotNil: [
+ newModel addDependent: self.
+ (newModel respondsTo: #preferredExtent)
+ ifFalse: [((self submorphNamed: #title) submorphNamed: #expandButton) delete]].
+ model := newModel.!
- anObject ifNotNil: [anObject addDependent: self].
- model := anObject.!